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

Methods in ES6 objects: using arrow functions

提问人:fox 提问时间:6/28/2015 最后编辑:Sebastian Simonfox 更新时间:5/28/2022 访问量:62110

问:

在 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)
};

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

javascript ecmascript-harmony

评论

1赞 6/28/2015
在使用胖箭头语法时?仅当通过首先创建对象,然后在指向该对象的函数中执行赋值来更改值时。这可以通过构造函数非常干净地完成。thischopperthis
2赞 6/28/2015
此演示将在 Firefox 中运行。Chrome 还没有。jsfiddle.net/bfyarxfe
2赞 Walter Chapilliquen - wZVanG 6/28/2015
@fox,您必须在该 jsfiddle 上使用“use strict”。
1赞 6/28/2015
@fox:它在受支持的环境中工作正常。Firefox 还没有完全支持。在 Continuum 和方法调用的结果中尝试它。它有效。console.log()
3赞 Mohamed Yaseen 9/26/2020
Mozilla docs 说 没有自己的绑定 this 或 super,不应用作方法 Mozilla Arrow 函数文档

答:

17赞 Walter Chapilliquen - wZVanG 6/28/2015 #1

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

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

console.log(chopper.getOwner());

您必须在函数中声明:this

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

console.log(chopper.getOwner());

艺术

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());

评论

1赞 fox 6/28/2015
我在这里收到一个错误:"TypeError: Cannot read property 'owner' of undefined\n at Object.chopper.getOwner
0赞 Walter Chapilliquen - wZVanG 6/28/2015
我明白了,这是正确的用法,但是 esta 方法总是返回窗口对象。您必须在函数中声明。this
3赞 6/28/2015
this不一定是指 .它指的是封闭环境中的当前值,可能是也可能不是。也许这就是你的意思。只是想确保他明白这不是某个默认值。windowthiswindow
0赞 Walter Chapilliquen - wZVanG 6/28/2015
@torazaburo这对我来说很好,我试过了,现在指的是类this
2赞 6/28/2015
你写的东西等同于,但比简单的写更冗长.var chopperFn = function() { this.owner = 'Jhon'; this.getOwner = () => this.owner; }
233赞 user663031 6/28/2015 #2

箭头函数并非设计为在每种情况下都仅作为老式函数的较短版本使用。它们不打算使用关键字替换函数语法。箭头函数最常见的用例是作为不重新定义的短“lambdas”,通常用于将函数作为回调传递给某个函数。functionthis

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

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

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

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

// or

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

(它们之间有细微的差异,但只有在 中使用 时才重要,但事实并非如此,或者复制到另一个对象时才重要。supergetOwnergetOwner

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

评论

0赞 fox 6/28/2015
如果我没看错的话,它似乎表明邮件列表降低了语法糖的优先级,即使这会导致代码的统一性/可读性更高。就目前而言,在 ES6 下的 OOP 上下文中使用 fat-arrow 函数比在 coffeescript 下更具挑战性。
0赞 6/28/2015
据我了解,句法糖被认为是考虑语言扩展的正当理由,但正如你所说,优先级较低——换句话说,此类提案的门槛更高。
0赞 Ben Carp 1/20/2021
有点困惑。根据我对函数关键字表示法的理解,这指向执行的上下文,即调用它的位置,而不是定义它的位置。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/.......在上面的示例中,您真的可以中继等于斩波器对象上定义的值吗?this.owner
0赞 prabushitha 9/26/2017 #3

此内部箭头函数不反映对象的上下文。相反,它提供了调用对象方法的上下文。

检查一下,这提供了一些关于何时使用箭头和何时不使用箭头的见解。 https://dmitripavlutin.com/when-not-to-use-arrow-functions-in-javascript/

评论

2赞 Sebastian Simon 10/8/2021
不,在箭头内部,对象字面量中的函数是指对象字面量所在的范围,而不是调用它的位置。this
7赞 foxiris 2/3/2020 #4

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

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

尽管这不是最佳做法,但在更改对象名称时,必须更改此箭头函数。

3赞 Isuru Maldeniya 2/11/2020 #5

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

  • 对将使用语法的方法使用非箭头函数。(这些函数将从其调用方接收有意义的值。object.method()this
  • 对几乎所有其他事情都使用箭头函数。
3赞 Vimniky Luo 10/7/2020 #6

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

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

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