JavaScript惯用编码风格 - 在原型上声明函数和在构造函数内部声明函数的时机

3
在Javascript中,如果我想声明一个"公开"的可访问函数,应该采用何种惯用方法?
MyObj.prototype.foo = function() {
    ...
}

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

什么情况下需要选择一种样式而不是另一种样式?其中一种样式比另一种样式的优势是什么?
非常感谢您的帮助!

1
在构造函数中声明JavaScript对象方法与在原型中声明的区别 - Felix Kling
1
JavaScript:何时在构造函数内定义函数,何时使用原型? - Felix Kling
1个回答

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%的情况下,这并不重要,但在性能密集型的情况下可能会有所影响。


你的某处有错别字。我认为粗体语句应该是“在第二个版本中”……? - pedz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接