我只是在玩Javascript子类化的想法。我喜欢假装扩展本机对象(如Array,String等)是一个坏主意。无论如何,这完全不是我对原因的理解。
话虽如此,让我们继续吧。
我要做的是扩展数组(现在,extend
可能不适合我正在做的事情)
我想创建我的新课程MyArray
,我希望有2个方法。 .add
和.addMultiple
。
所以我这样实现了它。
function MyArray(){
var arr = Object.create(Array.prototype);
return Array.apply(arr, arguments);
}
MyArray.prototype = Array.prototype;
MyArray.prototype.add = function(i){
this.push(i);
}
MyArray.prototype.addMultiple = function(a){
if(Array.isArray(a)){
for(var i=0;i<a.length;i++){
this.add(a[i]);
}
}
}
这是正常的,但如果我这样做
console.log(Array.prototype.addMultiple );
console.log(Array.prototype.add);
我得到[Function]
和[Function]
。
所以这意味着我的代码正在修改本机Array
对象。我试图避免的东西。如何以这两个console.log
给我undefined
的方式更改此代码,但我仍然可以使用Array.prototype
等原生.push
方法?
TIA
答案 0 :(得分:1)
您应该设置适当的原型链:
function MyArray(){
Array.apply(this, arguments);
}
MyArray.prototype = Object.create(Array.prototype);
Object.create只是使用指定的原型创建新对象,因此在此操作之后为true:
MyArray.prototype !== Array.prototype; // true
Object.getPrototypeOf(MyArray.prototype) === Array.prototype; // true
答案 1 :(得分:0)
此:
MyArray.prototype = Array.prototype;
导致MyArray.prototype指向与Array.prototype相同的对象。因此,在此之后您对MyArray.prototype所做的一切也将完成到Array.prototype。
解决此问题的方法是在MyArray中存储Array的原型的浅表副本:
MyArray.prototype = clone(Array.prototype);
我从这里复制了它:
答案 2 :(得分:0)
使用课程extension
class MyArray extends Array {
add(i) {
this.push(i);
return this;
}
addMultiple(a) {
if (Array.isArray(a)) {
for (var i = 0; i < a.length; i++) {
this.add(a[i]);
}
}
return this;
}
}
var test = new MyArray();
test.addMultiple([1,2,3,4,5]).add(6).add(7);
console.log(test, test.indexOf(6));
&#13;
答案 3 :(得分:0)
Object.create(Array.prototype);
这只是创建一个新对象并返回对象。
因此,根据您的场景,您刚刚创建了数组对象并为数组对象添加了一些方法 - MyArray。它会影响原生数组。
您只是修改克隆对象。