2017-10-10 88 views
3

請解釋爲什麼函數foo的新實例obj2在項目數組中還有元素?爲什麼當我調用新的foo()時它不會被忽略?當創建對象的新實例時,爲什麼函數的屬性未被忽略爲缺省值?

var foo = function() {} 

foo.prototype = { 
    items : [], 
    addItem : function() 
    { 
    this.items.push("item"); 
    } 
} 

var obj = new foo(); 
obj.addItem(); 

console.log(obj.items.length); //1 as expected 

var obj2 = new foo(); 

console.log(obj2.items.length); // 1, why not 0????? 
+3

您已將它添加到原型,這意味着所有實例將共享它。 – JohanP

+0

你想重寫'foo'的正常函數方法嗎?如果沒有,我不會覆蓋整個'原型'。 – PHPglue

回答

0

因爲你items引用1個陣列,因此它會在所有新的對象相同的陣列(OBJ1和OBJ2)。

foo應該是:

function foo() { 
    this.items = [] 
    this.addItem = function() { ... } 
} 
1

您已經將其添加到,這意味着所有實例將共享它的原型。對於Foo的每個實例,您都希望有一個新的items陣列。爲了達到這個目的,你需要將其移出prototype並進入你的函數體。您將附加到this

function Foo() { 
    this.items = []; 
} 

Foo.prototype.addItem = function(item) { 
    this.items.push(item); 
} 
相關問題