ES6 类中的箭头与经典方法

Posted

技术标签:

【中文标题】ES6 类中的箭头与经典方法【英文标题】:Arrow vs classic method in ES6 class 【发布时间】:2018-02-04 09:06:21 【问题描述】:

有什么理由要编写 ES6 方法的经典语法吗?

class MyClass 

    myMethod() 
        this.myVariable++;
    


当我使用myMethod() 作为某个事件的回调时,我必须写这样的东西(在 JSX 中):

// Anonymous function.
onClick=() =>  this.myMethod(); 

// Or bind this.
onClick=this.myMethod.bind(this)

但是如果我将方法声明为箭头函数:

class MyClass 

    myMethod = () => 
        this.myVariable++;
    


我只能写(在 JSX 中):

onClick=this.myMethod

【问题讨论】:

我得到的只是一个语法错误。 我不确定它是否正常工作,但使用 Babel (Webpack) 可以。 那些无关的 是错误的。 抱歉,onClick=... 在 JSX 中,没有 html How to use arrow functions (public class fields) as class methods?的可能重复 【参考方案1】:

您使用的功能不是 ES6 的一部分。这是class fields proposal。它允许您初始化实例属性,而无需编写构造函数。 IE。你的代码:

class MyClass 

    myMethod = () => 
        this.myVariable++;
    


完全一样

class MyClass 

    constructor() 
        this.myMethod = () => 
            this.myVariable++;
        ;
    


这也向您展示了普通类方法和通过类字段创建的方法之间的区别:

一个普通的方法在类的所有实例之间共享(它在原型上定义) 为每个实例创建一个“类字段方法”

因此,与Use of 'prototype' vs. 'this' in javascript? 中提出的原因相同,但简而言之:

如果您需要每个实例的方法,请使用“类字段方法”。需要访问当前实例的事件处理程序就是这种情况。仅当您使用箭头函数时,才能访问this。 在所有其他情况下使用普通的类方法。

【讨论】:

以上是关于ES6 类中的箭头与经典方法的主要内容,如果未能解决你的问题,请参考以下文章

为什么解构与Javascript(ES6)中的经典赋值不同?

ES6 类中的 ES6 函数、箭头函数和“this”[重复]

Javascript学习笔记

多继承

八类

一个经典例子让你彻彻底底理解java回调机制