1

最初のクラスからプロパティの子を継承するクラスと別のクラスがあります。

function A() {}
A.prototype.children = [];

function B() {}
B.prototype = new A();
B.prototype.addChild = function(Child) {
    this.children.push(Child);
};

var b = new B();
b.addChild(new Object());

不思議なことに、bコンソールにダンプするとき、アイテムはありません.children(プロパティ.childrenが存在する場合、Chrome / Firefox)が、プロトタイプの.childrenプロパティは入力されます。何故ですか?

4

2 に答える 2

1

インスタンス用のデータを格納するためにプロトタイプを使用するべきではありません。this.childrenを実行すると、Bに子がないため、プロトタイプチェーンはAに続きます。@ Bergiによって提案されているように、次を削除する必要があります。

B.prototype = new A

定義してみてください:

function A() {
  this.children = [];
}
A.prototype.addChild = function (o) { this.children.push(o)};
var b = new A();
b.addChild({});
于 2013-03-27T01:49:14.000 に答える
1

スクリプトで作成される子配列は1つだけですが、継承により、各インスタンス(およびBのプロトタイプ)によって参照されます。プッシュすると、どこからでも変更が表示されます。

代わりに、すべてのインスタンスに独自の配列を指定します。

function A() {
    this.children = [];
}

また、すべてのBインスタンスが継承するnew A配列を1つだけ作成しないでください。代わりに、

function B() {
    A.call(this); // do everything the A constructor does on this instance
}
B.prototype = Object.create(A.prototype);
B.prototype.addChild = function(Child) {
    this.children.push(Child);
};
于 2013-03-27T01:54:02.763 に答える