8

我正在学习 Javascript,并且有几个关于 Javascript 和 OOP 的问题。我注意到各种教程中“类”中函数的不同声明。首先是内部构造函数:

Class = function () {
  this.doSomething = function() {....};
}

另一个是:

Class = function () {}
Class.prototype.doSomething  = function() {....};

哪些情况下应该使用第一种构造,哪些情况下应该使用第二种构造?

另一个问题是:我是否正确理解protectedjs中没有属性或方法?改用什么?

先感谢您!

4

1 回答 1

13

当您在构造函数中将函数定义为this.myFunction=...时,它特定于您的实例。这意味着它必须为所有实例构建并保存在内存中,这可能很重。也不能继承。

这样做的唯一正当理由是:

  • 特定值的封闭
  • 其他类型的特定功能(您可能每次都构建不同的功能)

大多数情况下,您真正​​需要的是原型上定义的函数。

来自对象的 MDN

JavaScript 中的所有对象都是 Object 的后代;所有对象都从 Object.prototype 继承方法和属性,尽管它们可能被覆盖。例如,其他构造函数的原型会覆盖构造函数属性并提供自己的 toString 方法。对 Object 原型对象的更改会传播到所有对象,除非受这些更改影响的属性和方法沿原型链被进一步覆盖。

关于您的其他问题:以下代码构建了一个不可直接访问的函数:

Class = function () {
   var imprivate = function(){...};
   this.doSomething = function() { uses imprivate};
}

缺点是每个Class. 这最常用于模块(您只有一个实例)。就个人而言,我更喜欢完全按照 ThiefMaster 在评论中的建议:我在我的私人函数前加上_

// private method
XBasedGrapher.prototype._ensureInit = function() {
于 2012-11-13T10:50:12.410 回答