1

コードで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の継承:親の配列変数は値を保持します

特定の値を含むすべての派生クラスに配列メンバー変数が必要です。基本クラスに配列を追加して同じことを実現しようとしていました。上記の質問で述べたように、同じことを実現するには、各派生クラスに配列メンバーを追加する必要があります。すべての派生クラスを変更せずにこれを実現する他の方法はありますか?

4

2 に答える 2

2

それらが作成されると、 と の両方が同じ配列オブジェクトderivedObj1.valuesderivedObj2.values指します。derivedObj1.values = [];プロパティを再割り当てするのと同じ方法で、最初に を使用してそれぞれを再割り当てするname場合、コードは期待どおりに動作します。

プロパティを元の baseObjectに追加する代わりに、配列をインスタンスに追加するメソッドをvalues作成できます。init

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();
于 2012-12-27T13:59:21.497 に答える
1

変数をすべてのインスタンスで共有したくない場合は、変数をプロトタイプに含めることはできません。配列のプロパティ定義だけで 2 番目のオブジェクトを作成し、それを 2 番目のパラメータとして次のように渡すことができますObject.create

var arrDef = {
        values: {
            writable: true,
            configurable: true,
            enumerable: true,
            value: []
        }
}
var derivedObj1 = Object.create(baseObject, arrDef);    
var derivedObj2 = Object.create(baseObject, arrDef);    
于 2012-12-27T14:06:57.367 に答える