2016-09-07 123 views
0

我只是玩弄用Javascript创建子类的想法。我喜欢假装扩展本地对象(如数组,字符串等)是一个坏主意。无论如何,这完全不在我的理解之中。无法扩展JavaScript原型

话虽如此,让我们继续吧。

我试图做的是延长阵列(现在,extend可能不是正确的术语,我在做什么)

我要创建我的新类,我想有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 s会给我undefined的方式更改此代码,但我仍然可以使用像.push这样的原生Array.prototype方法?

TIA

回答

1

,您应该设置适当的原型链:

function MyArray(){ 
    Array.apply(this, arguments); 
} 

MyArray.prototype = Object.create(Array.prototype); 

Object.create刚刚创建具有指定原型的新对象,所以在这之后的操作以下为真:

MyArray.prototype !== Array.prototype; // true 
Object.getPrototypeOf(MyArray.prototype) === Array.prototype; // true 
+0

说'函数MyArray'(构造函数)的当前内容不是真的有必要吗? – Katana314

+0

不,这样做不会允许我执行'MyArray.prototype.add'。 '.add'将是未定义的。 – AdityaParab

+0

@ Katana314:不!构造函数中的'var arr = Object.create(Array.prototype);'只是表示'var arr = []'的明确方式; – AdityaParab

0

此:

MyArray.prototype = Array.prototype;

导致MyArray.prototype指向与Array.prototype相同的对象。因此,之后对MyArray.prototype执行的所有操作也将完成Array.prototype。

解决这是阵列的原型的浅表副本,而不是存储在MYARRAY甲方式:

MyArray.prototype =克隆(Array.prototype);

我复制从这里:

Copy prototype for inheritance?

+0

谢谢,我来看看 – AdityaParab

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

+1

谢谢,我想用ES5来做! – AdityaParab

0
Object.create(Array.prototype); 

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

因此,根据你的场景,你刚刚创建了数组对象,并添加了一些方法到你的数组对象 - MyArray。它会影响本机阵列。

你只是在修改你的克隆对象。