2

継承メソッドのbackbone.jsで、作成者は次のことを行います。

var ctor = function() {};
// some other code ...

var child;
// some other code ...
ctor.prototype = parent.prototype;
child.prototype = new ctor();

上記は、私が理解しているように、新しいオブジェクトが親の典型的なチェーンを継承できるようにすることです。私はこれに頭を悩ませようとしていますが、実際には、上記とプロトタイプを直接割り当てることには違いがありますか?

child.prototype = parent.prototype

新しいキーワードを使わないと直接アクセスできないこの[[prototype]]オブジェクトが存在することを理解しています。ただし、ほとんどのオブジェクト宣言は次の形式であるため、

var SomeObj = function() {};
SomeObj.prototype.test = function() { return "Hello World"; }

上記のプロトタイプの割り当ての実際的な違いは何でしょうか?

4

2 に答える 2

3

プロトタイプは親タイプのインスタンスであることを忘れないでください。を使用child.prototype = parent.prototypeすると、親のプロトタイプインスタンスではなく、子のプロトタイプが親のプロトタイプと等しくなります。

を使用すると、大きな問題が発生しますchild.prototype = parent.prototype。子のプロトタイプを変更しようとすると、親のプロトタイプも変更されます。これは、それらが同じオブジェクトであるためです。

Child.prototype.childOnlyValue = 5;
// WARNING: Parent.prototype.childOnlyValue is now also 5,
//             because Parent.prototype === Child.prototype

親の新しいインスタンスを作成することは絶対に必要です。そうしないと、単一の共有プロトタイプを持つフラットなプロトタイプチェーンが作成されるため、上記で概説したような問題が発生します。

于 2012-05-01T05:39:02.420 に答える
0

上記の状況を説明するスクリプトです

var x = {
    // do nothing
};

var a = function() {};

a.prototype = x;

var b = new a();
console.log("b.__proto__ is x? " + (b.__proto__ == x)); // true

var c = function() {};
c.prototype = new a();
console.log("c prototype.__proto__ is x? " + (c.prototype.__proto__ == x)); // true

var anotherFn = function() {
    // do nothing
};
c.prototype.aFn = anotherFn;

var d = new c();
console.log("d __proto__^2 is x?" + (d.__proto__.__proto__ == x)); // true
console.log("d __proto__.aFn is anotherFn? " + (d.__proto__.aFn == anotherFn)); // true
于 2012-05-01T23:17:00.773 に答える