惯用的Javascript编码样式 - 何时在原型vs函数构造函数内声明函数

时间:2013-07-09 20:39:21

标签: javascript

在Javascript中,当我想声明一个'公开'可访问函数时,什么是惯用法?

MyObj.prototype.foo = function() {
    ...
}

function MyObj() {
  this.foo = function() {
     ... 
  }
}

哪种情况会决定另一种风格? 一个优于另一个的优点是什么?

非常感谢帮助!

1 个答案:

答案 0 :(得分:2)

核心差异

当在原型上声明的方法时,它在通过调用函数作为构造函数创建的所有实例之间共享。

//assuming the first kind
var a = new MyObj();
var b = new MyObj();
//a and b both have the _same_ foo method

另一方面,当它在类中创建时,每个都有自己的函数实例。

//assuming the second kind
var a = new MyObj();
var b = new MyObj();
//a and b both have the _different_ foo methods

什么时候重要

在原型上创建内容对于共享功能非常有用。它比为每个实例提供自己的方法副本更快。但是,如果构造创建了闭包,则函数将可以访问它。

您只能在第二个版本中访问创建的结尾

function MyObj(x) {
    var y = x;
    this.foo = function() {
         console.log(y);
    }
}

这在第一个版本中是不可能的。虽然在这个例子中这看起来很愚蠢但有时闭包非常有用。但是,由于函数现在可以访问闭包,即使它不使用它 - 它也会变慢。这在99%的案例中微不足道,但在性能密集的情况下,它可能很重要。