2016-06-10 58 views
1

如果這個問題看起來很愚蠢,但是我對JS比較陌生,道歉。爲什麼javascript實例間共享屬性

我有一類繼承動物的狗。動物有一個陣列屬性。 在代碼中,我創建一個新的狗並添加東西到數組中。 問題是Dog的每個新實例似乎都共享該數組。

Animal.js:

define([ 
 
    "dojo/_base/declare", 
 
    "evo/common/model/_Model" 
 
    ], function(declare, _Model) { 
 
    return declare([_Model], { 
 
    _id: 0, 
 
    _items: [], 
 
    _filter: null, 
 
    
 
    ... 
 
    
 
    }); 
 
});

Dog.js:

define([ 
 
    "dojo/_base/declare", 
 
    "evo/common/model/_ModelList" 
 
], function (declare, _ModelList) { 
 
    return declare([_ModelList], { 
 
    
 
    ... 
 
    
 
    }); 
 
});

我固定復位_items當我創建一個新的狗,但我想,如果我有狗的多個實例會影響所有。 如何使屬性非靜態?

+0

可能重複的[Javascript對象構件被原型如下陣列成爲由所有的類實例共享](http://stackoverflow.com/q/4425318/1048572 )(假設你知道dojo聲明是什麼) – Bergi

+0

@Bergi不是真的......它只是被「扔」給我,沒有太多的解釋:) – algiogia

+0

如果你是JS的新手,也許你不應該從dojo開始: - )我建議http://eloquentjavascript.net/1st_edition/chapter8.html作爲教程,但還有更多。 – Bergi

回答

3

創建一個dojo類時,如果它包含數組或其他對象,應該在constructor()中聲明它們,這樣每個實例都可以按照您的預期獲取自己的副本。

請注意,在JS簡單類型(如字符串,數字,布爾值)中,null是按值賦值的,並且可以在dojo類中聲明。

而是通過引用來分配對象,包括數組(在JS中被認爲是「特殊」對象)。

實施例:

https://jsfiddle.net/ua3gytbu/

require(["dojo/_base/declare"], function(declare) { 
    var Animal = declare(null, { 
    constructor: function() {} 
    }); 
    var Dog = declare(Animal, { 
    constructor: function() { 
     this.items = []; 
    } 
    }); 

    var dog = new Dog(); 
    dog.items.push(1); 
    dog.items.push(2); 

    var dog2 = new Dog(); 
    dog2.items.push(3); 

    alert('dog has in items ' + dog.items.length); 
    alert('dog2 has in items ' + dog2.items.length); 
});