What advantage is there for using the arrow syntax for a method in a constructor?
The main advantage of using an arrow function as a method inside a constructor is that the value of this
gets set at the time of the function creation and can't change after that. So, when the constructor is used to create a new object, this
will always refer to that object. For example, let's say we have a Person
constructor that takes a first name as an argument has two methods to console.log
that name, one as a regular function and one as an arrow function:
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(); // Johnjohn.sayName2(); // John// The regular function can have its 'this' value changed, but the arrow function cannotjohn.sayName1.call(dave); // Dave (because "this" is now the dave object)john.sayName2.call(dave); // Johnjohn.sayName1.apply(dave); // Dave (because 'this' is now the dave object)john.sayName2.apply(dave); // Johnjohn.sayName1.bind(dave)(); // Dave (because 'this' is now the dave object)john.sayName2.bind(dave)(); // Johnvar sayNameFromWindow1 = john.sayName1;sayNameFromWindow1(); // undefined (because 'this' is now the window object)var sayNameFromWindow2 = john.sayName2;sayNameFromWindow2(); // John
The main takeaway here is that this
can be changed for a normal function, but the context always stays the same for an arrow function. So even if you are passing around your arrow function to different parts of your application, you wouldn't have to worry about the context changing.
This can be particularly helpful in React class components. If you define a class method for something such as a click handler using a normal function, and then you pass that click handler down into a child component as a prop, you will need to also bind this
in the constructor of the parent component. If you instead use an arrow function, there is no need to also bind "this", as the method will automatically get its "this" value from its enclosing lexical context. (See this article for an excellent demonstration and sample code: https://medium.com/@machnicki/handle-events-in-react-with-arrow-functions-ede88184bbb)