无法扩展javascript原型

时间:2016-09-07 13:18:55

标签: javascript inheritance prototype extend

我只是在玩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

4 个答案:

答案 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);

我从这里复制了它:

Copy prototype for inheritance?

答案 2 :(得分:0)

使用课程extension

&#13;
&#13;
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;
&#13;
&#13;

答案 3 :(得分:0)

Object.create(Array.prototype);

这只是创建一个新对象并返回对象。

因此,根据您的场景,您刚刚创建了数组对象并为数组对象添加了一些方法 - MyArray。它会影响原生数组。

您只是修改克隆对象。