2012-10-26 84 views
1

這段代碼有什麼問題?我試圖用所有本地數組的函數擴展foo類。JavaScript擴展Array類

function foo(){ 
    Array.call(this); 
} 

foo.prototype.addFruit=function(item){ 
    this.unshift(item); 
} 
foo.prototype=new Array(); 
foo.prototype.constructor=foo; 

var c =new foo(); 

c.addFruit('Apple'); 


document.write(c.join('-')); 
​ 

回答

2

你的方法addFruit增加的fooprototype,那麼你已改寫了的foo.prototype,所以這種方法缺少(原型改變到另一個對象你把一個方法到原來的原型後)。

您應該更改您的代碼順序,將prototype添加到prototype之前。

foo.prototype=new Array(); 
foo.prototype.constructor=foo; 

foo.prototype.addFruit=function(item){ 
    this.unshift(item); 
}; 
2

您的addFruit屬性您覆蓋整個prototype財產與new Array前添加原型。

相反的new Array,你應該使用Object.create(Array.prototype)所以你不要有一個實際的陣列例如爲原型(與length等),但只有一個對象從數組原型繼承。

Array.call(this)不幸的是不起作用。它返回一個新的數組,它不分配任何東西,但它不會對this執行任何操作。您可以通過this !== Array.call(this)進行檢查。實際上,這是不可能的「子類」Array - 閱讀http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-to-subclass-an-array

+0

謝謝,但有什麼區別foo.prototype = Object.create(Array.prototype); 和 foo.prototype = Array.prototype; – nullException

+0

第二個分配給另一個,這樣'foo.prototype === Array.prototype',而[Object.create](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create)通過正確設置的原型鏈創建一個新對象。 – Bergi