2

如果您不熟悉 EMCA6 草案,将添加箭头函数语法。主要区别在于:

  • 箭头函数具有词法 this (因此无需调用Function.prototype.bind或创建闭包)
  • 更短的语法() => "foo"vsfunction(){ return "foo";}
  • 箭头函数缺少 .prototype。所以它们不能用作构造函数,不能用 new 调用,并且是轻量级的。

话虽如此,让我们看一下以下简单的示例:

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.prototype.makeNoise我们每次初始化 Animal 时设置的,但与正常情况相比,上述设置是否有任何其他缺点:

var Animal = function(sound) {
    this.sound = sound;
};
Animal.prototype.makeNoise = function() { return this.sound; };

let dog = new Animal("woof!");
dog.makeNoise(); //woof!

我很想知道这样做是否有任何潜在的危险,因为我相信人们会很想在他们可以逃脱的任何地方使用新的缩短语法。提前致谢。

4

1 回答 1

4

我建议不要这样做,部分原因是 Pointy 在他的评论中给出的:你正在为 Animal 的每个实例创建一个新的箭头函数对象,这对性能不利,对内存管理也很糟糕。它实际上比仅仅复制函数对象更糟糕:因为它还围绕该函数创建了一个新的闭包,所以只要动物对象仍在内存中,垃圾收集器就无法释放任何构造函数的局部变量。

但也因为 ECMAScript 6 还为此目的引入了更好的语法:

class Animal {
   constructor(sound) {
       this.sound = sound;
   }
   makeNoise() {
       return this.sound;
   }
}
于 2013-09-29T23:40:44.943 回答