习语Javascript编码风格-何时在原型上声明函数,何时在函数构造函数内声明函数



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

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

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

什么情况会决定一种风格而不是另一种风格?一个比另一个有什么优势?

谢谢大家的帮助!

核心差异

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

//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%的情况下并不重要,但在性能密集型的情况下可能很重要。