两种不同的实例化方式

时间:2012-01-25 16:33:54

标签: javascript

这不是“如何”问题。我想讨论两种可能的JavaScript实例化方法,以找出每种方法的优缺点。

第一个:

function Counter() {
  this.counter = 0;
}

Counter.prototype.count = function() {
  this.counter += 1;
  return this.counter;
};

var counter = new Counter();

console.log("Counter: " + counter.count());

第二个:

var counter = new (function() {
  var counter = 0;
  this.count = function() {
    counter += 1;
    return counter;
  }
})();

console.log("Counter: " + counter.count());

重要提示:counter应该只实例化一次。

第一个看起来更结构化,但第二个不会使用不必要的Counter函数混淆命名空间。

你怎么看?我应该考虑这两段代码相同吗?我错过了什么吗?


顺便说一下,我现在使用第二种方式。我问这个问题的原因是JSHint声称这是一个“奇怪的结构”。并建议删除显然违反代码的new

3 个答案:

答案 0 :(得分:1)

唯一的区别是counter可以在第一种方法中被外部源修改(假设两个“类”只会被初始化一次)。

在第一种方法中,counter是“公开”可见且可编辑的属性 在第二种方法中,counter是一个局部变量,不能被函数外的任何东西修改。

counter = new Counter();
counter.count(); // 1
counter.count = 9001; // Not intended?
counter.count(); // 9002

答案 1 :(得分:0)

AFAIK,一个直接的区别是你可以在第一个代码块中多次调用Counter();而在第二个函数中,函数没有赋值,直接返回变量,因此无法再次调用。

答案 2 :(得分:0)

不,他们不相同。考虑第一个。它更灵活,因为您可以在应用程序的其他部分使用原型扩展它。而在第二个中,您将无法轻松完成,因为您没有主类引用。