我
在构造函数中使用箭头函数有什么好处?
难度:
在构造函数里使用箭头函数的主要优点是它的 this
只与箭头函数创建时的 this
保持一致,并且不会修改。所以,当用构造函数去创建一个新的对象的时候,箭头函数的 this
总是指向新创建的对象。比如,假设我们有一个 Person
构造函数,它接受一个 firstName
参数,并且它有两个方法去调用 console.log
这个 firstName
,一个是正常的函数,而另一个则是箭头函数:
js
const Person = function (firstName) {
this.firstName = firstName;
this.sayName1 = function () {
console.log(this.firstName);
};
this.sayName2 = () => {
console.log(this.firstName);
};
};
const john = new Person("John");
const dave = new Person("Dave");
john.sayName1(); // John
john.sayName2(); // John
// 普通函数的 this 可以被修改,而箭头函数则不会
john.sayName1.call(dave); // Dave (因为 "this" 现在指向了 dave 对象)
john.sayName2.call(dave); // John
john.sayName1.apply(dave); // Dave (因为 "this" 现在指向了 dave 对象)
john.sayName2.apply(dave); // John
john.sayName1.bind(dave)(); // Dave (因为 "this" 现在指向了 dave 对象)
john.sayName2.bind(dave)(); // John
var sayNameFromWindow1 = john.sayName1;
sayNameFromWindow1(); // undefined (因为 "this" 现在指向了 Window 对象)
var sayNameFromWindow2 = john.sayName2;
sayNameFromWindow2(); // John
这里主要的区别是,正常函数的 this
是可以在执行过程中被改变的,而箭头函数的 this
则会一直保持一致。所以在使用箭头函数的时候,你就不需要担心它的上下文被改变了。
这在 React 的类组件里非常有用。如果你使用普通的函数来定义一个类方法,比如一个点击处理函数,然后你将这个点击处理函数通过 prop 的形式传递给子节点,你将必须在父组件的 constroctor
里使用 fn.bind(this)
的形式来确保该函数能正常工作。但是如果你使用箭头函数的话,你就不需要手动去绑定 this
了,因为箭头函数会自动绑定创建时的 this
。
(想看更好的演示以及示例代码,可以打开这篇文章: https://medium.com/@machnicki/handle-events-in-react-with-arrow-functions-ede88184bbb)