5

以下のようなオブジェクトを作成しました。

var BaseObject = function(){

var base = this;
base.prop;

base.setProp = function(val){
    base.prop = val;
}
}

メソッドを呼び出すとsetProp、次のようになります。

var a = new BaseObject();
var b = new BaseObject();           

a.setProp("foo");
b.setProp("bar");

console.log(a.prop); // outputs 'foo'
console.log(b.prop); // outputs 'bar'

次に、このように継承する別のオブジェクトを作成しましたBaseObject

var TestObject = function(){
    // do something
}

TestObject.prototype = new BaseObject();

同じことをすると、予想していなかった結果が得られます。

var a = new TestObject();
var b = new TestObject();

a.setProp("foo");
b.setProp("bar");

console.log(a.prop); // outputs 'bar'
console.log(b.prop); // outputs 'bar'

どうしてか分かりません。最近、クロージャーとプロトタイプの継承について多くのことを読んでいますが、すべて混乱していると思います。したがって、この特定の例がこのように機能する理由についての指針をいただければ幸いです。

4

2 に答える 2

3

すべての が継承するBaseObjectインスタンスは 1 つだけです。TestObjectプロトタイプ チェーンの作成にインスタンスを使用しないでください。

あなたが望むものは:

var TestObject = function(){
    BaseObject.call(this); // give this instance own properties from BaseObject
    // do something
}
TestObject.prototype = Object.create(BaseObject.prototype);

JavaScript の継承: Object.create と newJavaScript の継承の修正、およびDerived.prototype = new Base で 'new' キーワードを使用する理由は何ですか を参照して、 の問題の詳細な説明を確認してnewください。Crockford の Prototypal inheritance - Issues with nested objectsもご覧ください。

于 2012-10-29T18:47:11.613 に答える
2

protoypalの継承は、クラスの概念なしで、オブジェクトのみを処理するものと考えてください。コードにBaseObjectは、属性を持つオブジェクトがありpropます。そのオブジェクトの1つのインスタンスから拡張する他の2つのオブジェクトがありますが、プロパティは元のオブジェクトに属しています。各オブジェクトに独自のコピーが必要な場合は、そのオブジェクトに対して初期化される個別の変数を指定する必要があります(コンストラクターなど)。

余談ですが、JavaスタイルのアクセサーはJavaScriptではやり過ぎであり(必要に応じてネイティブにアクセスをインターセプトできます)、動作が異なるため、これらの質問をさらに混乱させる可能性があります。

于 2012-10-29T18:36:31.627 に答える