如果我这样做:
Array.prototype.test = "test"
Array.prototype.t = function() {return "hello"}
每个新的Array
都将具有属性test
和方法t
。
如何在不影响所有阵列的情况下执行相同的操作?
赞:
Names = function(arr){
// Contacts constructor must be the same of Array
// but add the property test and the function t
}
z=new Names(["john","andrew"])
这样z.test
将返回"test"
,而z.t()
将返回"hello"
吗?
(但是Array.test
和Array.t
将保持undefined
)
我的解释更好:
Array.prototype.t="test";
Array.prototype.test = function(){ return "hello";}
z=new Array("john", "andrew")
console.log(z);
但这会影响所有数组。 我想要相同的东西,但是要有一个继承Array构造函数的新构造函数名称。
答案 0 :(得分:2)
class Names extends Array {
constructor(...args) {
super(...args);
}
}
Names.prototype.t = 'test';
let z = new Names("john", "andrew")
z.push('Amanda')
console.log(z.t)
console.log(z)
您可以轻松地将其设置为Names.prototype
答案 1 :(得分:1)
您不能只扩展Array
吗?
class Names extends Array {
constructor(...args) {
super(...args);
this.t = "test";
}
test() { return "hello" }
}
let z = new Names("john", "andrew")
答案 2 :(得分:1)
这是一个粗略的实现:
function Names(arr) {
this.contacts = enhanceArray(arr);
}
function enhanceArray(arr) {
arr.test = 'helloProp';
arr.t = function() {
return 'helloFunc'
}
return arr;
}
let z = new Names(["john", "andrew"]);
console.log(z.contacts[0]);
console.log(z.contacts.test);
console.log(z.contacts.t());
答案 3 :(得分:0)
您可以创建自己的扩展Array构造函数工厂,例如
(() => {
const myArr = XArray();
let a = myArr(["John", "Mary", "Michael"]);
console.log(`myArr(["John", "Mary", "Michael"]).sayHi(1): ${a.sayHi(1)}`);
console.log("demo: myArr(1, 2, 3) throws an error");
let b = myArr(1, 2, 3); // throws
// an extended array
function XArray() {
const Arr = function(arr) {
if (arr.constructor !== Array) {
throw new TypeError("Expected an array");
}
this.arr = arr;
};
Arr.prototype = {
sayHi: function (i) { return `hi ${this.arr[i]}`; }
};
return arr => new Arr(arr);
}
})();