我怎么能(或者有可能)创建一个JavaScript基类,在它的构造函数中自动调用每个实例方法的bind?
我试过了,没有成功:
class BaseClass {
constructor() {
// for (let i in this.__proto__) { // <-- this also failed
for (let i in this) {
if (typeof this[i] === 'function') {
this[i] = this[i].bind(this);
}
}
}
}
class MyClass extends BaseClass {
constructor() {
super();
this.foo = 'bar';
}
myMethod() {
console.log(this.foo);
}
}
当我在构造函数中设置断点时,this.myMethod
存在,并且它存在于this.__proto__
中,但它在Object.getOwnPropertyNames(this)
中并不存在于类{&1;}中。 s构造函数,也不是基类的构造函数。
基本上我试图在this blog post(结论之后)中执行 Bonus Step ,而无需手动定义或调用_bind()
。
答案 0 :(得分:7)
ES6类方法是不可枚举的,因此您必须自己走原型链。
for (let obj = this; obj; obj = Object.getPrototypeOf(obj)){
for (let name of Object.getOwnPropertyNames(obj)){
if (typeof this[name] === 'function'){
this[name] = this[name].bind(this);
}
}
}
避免这种复杂性是为什么&#34; Bonus Step&#34;明确命名要绑定的东西。在每个创建的对象上执行此操作的速度也会慢一些。