2016-09-07 141 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。它會影響本機陣列。

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