在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对象中使用fat-pipe方法?
答案 0 :(得分:91)
箭头功能并非设计用于任何情况,仅仅作为旧式功能的较短版本。它们无意使用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;
}
};
(它们之间存在细微差别,但只有在super
中使用getOwner
时才会有用,或者您将getOwner
复制到另一个对象。)
在es6邮件列表上有一些关于箭头函数扭曲的争论,这些函数具有相似的语法,但有自己的this
。但是,这个提议很难被接受,因为这仅仅是语法糖,允许人们保存键入几个字符,并且不提供现有函数语法的新功能。请参阅主题unbound arrow functions。
答案 1 :(得分:7)
在这一行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());

答案 2 :(得分:1)
我遵循的使用箭头功能的快速提示。
object.method()
语法的方法。 (这些函数将从其调用者处接收有意义的this
值。)答案 3 :(得分:0)
如果必须使用箭头功能,可以将this
更改为chopper
,
var chopper = {
owner: "John",
getOwner: () => chopper.owner
};
尽管这不是最佳做法,但是在更改对象名称时,必须更改此箭头功能。
答案 4 :(得分:0)
另一个提示,在严格模式下,this
仍然引用Window而不是未定义。
(() => {
"use strict";
console.log(this); // window
})();
(function () {
"use strict";
console.log(this); // undefined
})();
答案 5 :(得分:-1)
此内侧箭头功能不反映对象的上下文。相反,它给出了调用对象方法的上下文。
选中此项,这可以让您了解何时使用箭头以及何时不使用箭头。 https://dmitripavlutin.com/when-not-to-use-arrow-functions-in-javascript/
答案 6 :(得分:-3)
是的,可以在对象文字中使用箭头功能(对此具有访问权限)。您应该使用Object.assign()方法。
let chopper = {
owner: 'John',
getOwner: () => { console.log(this.owner); }
};
Object.assign(this, chopper);
chopper.getOwner();