ES6 对象中的方法:使用箭头函数

IT技术 javascript ecmascript-6 ecmascript-harmony
2020-12-16 15:51:57

在 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 对象中使用粗箭头方法?

6个回答

箭头函数并非设计为在所有情况下都仅用作旧式函数的较短版本。它们不打算使用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;
    }
};

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

在 es6 邮件列表上有一些关于箭头函数的扭曲的争论,这些函数具有相似的语法但有自己的this. 然而,这个提议并不受欢迎,因为它只是语法糖,允许人们节省输入几个字符,并且没有提供比现有函数语法更多的新功能。请参阅主题未绑定箭头函数

如果我没看错的话,这似乎表明邮件列表会降低语法糖的优先级,即使它会导致代码的一致性/可读性更高。就目前而言,在 ES6 下的 OOP 上下文中使用粗箭头函数比在 coffeescript 下更具挑战性。
2021-02-18 15:51:57
有点糊涂。根据我对函数关键字符号的理解,这指向执行的上下文,它被调用的地方,而不是它被定义的地方。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...在上面的示例中,您真的this.owner可以继续使用等于在斩波器对象上定义的值吗?
2021-03-02 15:51:57
据我了解,语法糖认为是考虑语言扩展的有效理由,但正如您所说的优先级较低 - 换句话说,此类建议的门槛更高。
2021-03-09 15:51:57

在这一行getOwner: () => this.owner应该是:

var chopper = {
    owner: 'John',
    getOwner: () => this.owner
}; //here `this` refers to `window` object.

您必须声明this为一个函数:

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

或者:

var chopperFn = function(){

    this.setOwner = (name) => this.owner = name;
    Object.assign(this,{
        owner: 'Jhon',
        getOwner: () => this.owner,
    })

}

var chopper = new chopperFn();
console.log(chopper.getOwner());
chopper.setOwner('Spiderman');
console.log(chopper.getOwner());

我明白了,这是正确的用法,但是方法 esta 总是返回 window 对象。您必须this在函数内声明
2021-02-10 15:51:57
@torazaburo 对我来说很好,我试过了,this现在指的是课堂
2021-02-12 15:51:57
你所写的相当于,但比简单地写更冗长var chopperFn = function() { this.owner = 'Jhon'; this.getOwner = () => this.owner; }
2021-02-25 15:51:57
this不一定指window. 它指的this是封闭环境中的任何当前值,可能是也可能不是window也许这就是你的意思。只是想确保他明白这不是一些默认值。
2021-02-26 15:51:57
我在这里遇到错误: "TypeError: Cannot read property 'owner' of undefined\n at Object.chopper.getOwner
2021-03-03 15:51:57

如果您必须使用箭头功能,您可以更改thischopper

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

虽然这不是最佳实践,但是当您更改对象名称时,您必须更改此箭头函数。

我遵循的使用箭头函数的快速提示。

  • 将非箭头函数用于将使用object.method()语法的方法。(这些函数会this从调用者那里获得有意义的值。)
  • 几乎所有其他事情都使用箭头函数。

另一个提示,在严格模式下,this仍然指的是 Window 而不是 undefined。

  (() => {
    "use strict";
    console.log(this); // window
  })();

  (function () {
    "use strict";
    console.log(this); // undefined
  })();