次のスニペットで何が起こっているのか、バインディングを使用する方法(ウォーク・フレンズをコンストラクタの外にある方法で修正する方法)について理解していますが、なぜこのようなことが起こりますか?クラスのスコープを独自のメソッドにバインドしなければならないのは直感的ではないようです。ES6クラス内のスコープ
class Person {
constructor(name, friend) {
this._name = name;
if(friend) {
this.walkFriend = friend.walk;
}
}
get name() {
return this._name.toUpperCase();
}
walk() {
console.log(this.name + ' is walking.');
}
}
let bob = new Person('Bob');
let bill = new Person('Bill', bob);
console.log(bob.name); // BOB
console.log(bill.name); // BILL
bill.walk() // Bill is walking.
bill.walkFriend(); // expect 'BOB us walking', but get 'BILL us walking.'
私は弱いマップで完全に遅くなりました: https://jsfiddle.net/cswl/3cqjjfvc/1/ – cswl
@cswl:LOL!しかし、それは 'Person'インスタンスが関連する' friend'をメモリ内に保持することを妨げるものではないことに注意してください。 WeakMapとWeakSetの**キー**はオブジェクトではなく弱く保持されていることに注意してください。だから私が間違っている場合は私を修正しますが、実際にはここでWeakMapを使用しても、バインディングだけでは役に立ちません。 –
@ T.J.Crowder美しく語られた答えをありがとう。それは非常に明確に表現されていました。 ベスト、 –