如果没有构造函数,绑定这在类中是可选的吗?

时间:2017-02-23 03:47:01

标签: javascript ecmascript-6

我有下课,但我对此处的绑定感到困惑。这个类没有构造函数和super(),为什么他需要在setAll方法上绑定它?我删除了绑定,应用程序仍然工作,没有错误。

class PushScheduleActions {

    /**
     * Request all API
     */
    fetchAll(params) {
        return dispatch => {
            dispatch(params);

            PushScheduleApi.getAll(params)
                .then(this.setAll.bind(this));//why use bind this here?
                .catch(this.setError.bind(this));
        }
    }

    setAll(data) {
        return data;
    }
}

3 个答案:

答案 0 :(得分:1)

构造函数,超级和绑定之间没有关系。

什么绑定呢? 它返回一个新函数,并传递了上下文用户。

在你的情况下,PushScheduleApi成功案例是你传递一个由bind方法返回的新setAll函数。

  1. 由于您的setAll功能不使用上下文,因此您无需传递上下文。

  2. dispatch是一个箭头函数,因此继承了上下文。所以你不需要绑定方法。你可以简单地使用this.setAll

答案 1 :(得分:0)

bind()函数创建一个新的绑定函数(BF)。 BF是一个外来函数对象(来自 ECMAScript 2015 的术语),它包装了原始函数对象。通常调用BF会导致执行包装函数。

有关详细信息,请点击此链接,我希望它能帮助您理解 bind()方法 Use of the JavaScript 'bind' method

答案 2 :(得分:0)

  

班级没有构造函数和super()

这完全无关紧要。

  

为什么他需要在setAll方法上绑定它?

只有在

时才需要绑定方法
  • 它使用this
  • this应该引用this内部fetchAll引用的内容(可能是PushScheduleActions的实例)。

由于setAll没有引用this,因此没有理由绑定。

但是,整个setAll方法是不必要的。没有.then(this.setAll.bind(this)),代码将完全相同。这让我觉得PushScheduleActions应该是子类,而子类应该覆盖setAll。现在,孩子班' setAll可能会使用this并期望它引用该实例。由于父类(PushScheduleActions)无法知道,绑定方法更安全,因为它将确保setAll的子类实现无论是否使用this或不