私はこの動作を理解しようとしています。私はES6クラスで観察しています。次のコードを考えてみましょう。とてもシンプルです:親クラス(Parent
)と子クラス(Child
)を継承しています。 Parent
クラスには、getLabel
というメソッドがあり、これは単にそのクラスのlabelプロパティを返します。ES6でObject.assignの動作を理解しようとしています
子クラスのインスタンスを作成するときに、そのラベルを設定して、それをすべてうまく印刷しようとします。
ただし、最初のインスタンスでを使用して子クラスの別のインスタンスを作成すると、明示的に変更していても、新しいインスタンスは1番目のインスタンスのラベル値を保持します。
class Parent {
constructor(label) {
this.getLabel =() => {
return this.label;
};
this.label = label;
}
}
class Child extends Parent {
constructor(label) {
super(label);
this.label = label;
}
}
const c = new Child('Child');
console.log('c getLabel() = ' + c.getLabel());//Prints "Child"
const c1 = Object.assign(new Child('C1'), c);
c1.label = 'Child Modified';
console.log('c1 getLabel() = ' + c1.getLabel());//Prints "Child" again instead of "Child Modified".
なぜこれが起こっているのかわかりません!私はその後、Parent
クラスで私はgetLabel
メソッドを定義しています方法を変更されたのは何
:誰かがこれらの二つの異なる動作を説明できる場合
class Parent2 {
constructor(label) {
this.label = label;
}
getLabel() {
return this.label;
}
}
class Child2 extends Parent2 {
constructor(label) {
super(label);
this.label = label;
}
}
const c2 = new Child2('Child 2');
console.log('c2 getLabel() = ' + c2.getLabel());//Prints "Child 2" as expected.
const c3 = Object.assign(new Child2('C3'), c2);
c3.label = 'Child 2 Modified';
console.log('c3 getLabel() = ' + c3.getLabel());//Prints "Child 2 Modified" as expected.
は、私には理解されます。
上記のコードでは、ES6フィドルはhttp://www.es6fiddle.net/is6ex359/です。
矢印関数は字句「this」を使用します。あなたのオブジェクトには、 'Object.assign'を呼び出すときに新しい子にコピーされる' getLabel'というプロパティがあります。そのプロパティには元のParentへのレキシカル 'this'リファレンスを持つ関数が含まれています。矢印関数の代わりに通常の関数を使用した場合、その動作は表示されません。 – Paulpro
ところで、 'super(label)'は既に 'this.label'を割り当てているので、' this.label = label'は必要ありません。 – Oriol
@Oriol ...ありがとう!この質問の例を考え出すのは私だけでした。 –