如果您不熟悉,EMCA6草案将添加arrow function syntax。主要区别在于:
() => "foo"
vs function(){ return "foo";}
话虽如此,让我们来看看以下简单的例子:
var Animal = function(sound) {
this.sound = sound;
//arrow notation has lexical this, so this makeNoise must be defined in the constructor
Animal.prototype.makeNoise = () => this.sound;
};
let dog = new Animal("woof!");
dog.makeNoise(); //woof!
在这里,我正在创建一个简单的类,恰好使用箭头函数作为其方法之一而不是普通函数。我知道每次初始化Animal时都会设置Animal.prototype.makeNoise
,但与正常情况相比,上面有任何其他缺点:
var Animal = function(sound) {
this.sound = sound;
};
Animal.prototype.makeNoise = function() { return this.sound; };
let dog = new Animal("woof!");
dog.makeNoise(); //woof!
我很想知道这样做是否有任何潜在的危险,因为我相信人们会在任何可以逃脱的地方使用新缩短的语法。提前谢谢。
答案 0 :(得分:3)
我建议不要这样做,部分是因为Pointy在他的评论中给出了:你正在为Animal的每个实例创建一个新的箭头函数对象,这对于性能不利而且对于内存管理来说很糟糕。它实际上甚至比复制函数对象更糟糕:因为它还会围绕该函数创建一个新的闭包,只要动物对象仍在内存中,垃圾收集器就无法释放任何构造函数的局部变量。
但也因为ECMAScript 6还为这个目的引入了更好的语法:
class Animal {
constructor(sound) {
this.sound = sound;
}
makeNoise() {
return this.sound;
}
}