在构造函数期间自动在es6中的所有实例方法上调用bind()

时间:2015-06-04 16:34:01

标签: javascript ecmascript-6

我怎么能(或者有可能)创建一个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()

1 个答案:

答案 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;明确命名要绑定的东西。在每个创建的对象上执行此操作的速度也会慢一些。