簡體   English   中英

Javascript:數組成員變量在原型繼承中不作為實例變量工作

[英]Javascript: array member variable not working as instance variable in prototypical inheritance

我試圖在我的代碼中使用javascript繼承。 以下是相同的jsfiddle。 http://jsfiddle.net/Fetsz/3/

var baseObject = Object.create(Object, {  
    // this works as an instance variable for derived objects  
    name: {
        writable: true,
        configurable: true,
        enumerable: true,
        value: null    
    },   
    // this should act as instance variable for derived objects   
    values: {
        writable: true,
        configurable: true,
        enumerable: true,
        value: []    
    },
    displayAlert: {
        value: function (){
            alert("Alert from base object");
        }
    }
});

var derivedObj1 = Object.create(baseObject, {});    
var derivedObj2 = Object.create(baseObject, {});    

function displayValues (obj) {
    alert("values for " + obj.name + "\n" + JSON.stringify(obj.values));
};

$(document).ready(function(){
    derivedObj1.name = "Object 1";
    derivedObj2.name = "Object 2";

    derivedObj1.values.push("DO1 element");
    derivedObj2.values.push("DO2 element");

    derivedObj1.displayAlert();

    // should display values added only for derivedObj1
    displayValues(derivedObj1);

    // should display values added only for derivedObj2
    displayValues(derivedObj2);
});

我還檢查了以下問題,很好地解釋了為什么我的代碼不起作用。 Javascript繼承:Parent的數組變量保留值

我需要在每個派生類中都有一個數組成員變量,它將包含某些值。 我試圖通過在基類中添加數組來實現相同的目標。 正如上面提到的問題,為了實現相同的目的,我將不得不為每個派生類添加數組成員。 有沒有其他方法來實現這一點而不修改每個派生類?

創建它們時, derivedObj1.valuesderivedObj2.values指向同一個數組對象。 如果你首先使用derivedObj1.values = [];重新分配每一個derivedObj1.values = []; ,就像重新分配name屬性一樣,您的代碼將按預期運行。

您可以創建一個將數組添加到實例的init方法,而不是將values屬性添加到原始baseObject:

var baseObject = Object.create(Object, {  
    // this works as an instance variable for derived objects  
    name: {
        writable: true,
        configurable: true,
        enumerable: true,
        value: null    
    },   
    // this should act as instance variable for derived objects   
    init: {
        writable: true,
        configurable: true,
        enumerable: true,
        value: function(){
            this.values = [];
        }
    },
    displayAlert: {
        value: function (){
            alert("Alert from base object");
        }
    }
});

var derivedObj1 = Object.create(baseObject, {});
derivedObj1.init();
var derivedObj2 = Object.create(baseObject, {});
derivedObj2.init();

如果您不希望所有實例共享變量,則您的變量不能在原型上。 您可以僅使用數組的屬性定義創建第二個對象,並將其作為第二個參數傳遞給Object.create

var arrDef = {
        values: {
            writable: true,
            configurable: true,
            enumerable: true,
            value: []
        }
}
var derivedObj1 = Object.create(baseObject, arrDef);    
var derivedObj2 = Object.create(baseObject, arrDef);    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM