javascript - ES6 对象中的方法 : using arrow functions

标签 javascript ecmascript-6 ecmascript-harmony

在 ES6 中,这两个都是合法的:

var chopper = {
    owner: 'Zed',
    getOwner: function() { return this.owner; }
};

并且,作为速记:

var chopper = {
    owner: 'Zed',
    getOwner() { return this.owner; }
}

是否也可以使用新的箭头功能?在尝试类似的东西时

var chopper = {
    owner: 'John',
    getOwner: () => { return this.owner; }
};

var chopper = {
    owner: 'John',
    getOwner: () => (this.owner)
};

我收到一条错误消息,提示该方法无法访问 this。这只是一个语法问题,还是您不能在 ES6 对象中使用粗箭头方法?

最佳答案

箭头函数并非设计用于所有情况,而只是作为老式函数的简化版本。它们并非旨在使用 function 关键字替换函数语法。箭头函数最常见的用例是短的“lambdas”,它不重新定义 this,通常在将函数作为回调传递给某个函数时使用。

箭头函数不能用于编写对象方法,因为正如您所发现的,由于箭头函数关闭词法封闭上下文的 this,因此 this 在箭头是您定义对象的当前箭头。也就是说:

// Whatever `this` is here...
var chopper = {
    owner: 'Zed',
    getOwner: () => {
        return this.owner;    // ...is what `this` is here.
    }
};

在你的例子中,想要在一个对象上写一个方法,你应该简单地使用传统的 function 语法,或者 ES6 中引入的方法语法:

var chopper = {
    owner: 'Zed',
    getOwner: function() {
        return this.owner;
    }
};

// or

var chopper = {
    owner: 'Zed',
    getOwner() {
        return this.owner;
    }
};

(它们之间有细微差别,但只有当您在 getOwner 中使用 super 时它们才重要,而您不是,或者如果您复制 getOwner 到另一个对象。)

在 es6 邮件列表上有一些关于箭头函数的扭曲的争论,箭头函数具有相似的语法但有自己的 this。然而,这个提议并没有得到很好的接受,因为它只是语法糖,让人们可以节省输入几个字符,并且没有提供比现有函数语法更多的新功能。见题目unbound arrow functions .

关于javascript - ES6 对象中的方法 : using arrow functions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31095710/

相关文章:

javascript - 如何从给定的正则表达式中删除定界符?

javascript - 悬停在另一个元素上时保持 li 的悬停状态

javascript - JS - Object.keys() 中的三元语句

javascript - 从数组创建对象

javascript - 浅拷贝对象遗漏了 ES6/ES7 中的一个或多个属性?

javascript - JavaScript 对象中的 [[Class]] 属性

javascript - NodeJS 和谐在导入时给出 SyntaxError

javascript - 如何在找到第一个匹配项时停止 DOM 搜索循环?

javascript - 自动转到在 React Virtual Dom 中创建的 div 元素

javascript - 关于在 lambda 上保存图像