没有定义类的对象实例

时间:2015-01-20 10:28:11

标签: javascript oop object

我使用以下方法定义对象的实例而不定义类:

var obj = new function () {
  this.x = 25;                // Public variable
  var y = 10;                 // Private variable

  this.print = function () {  // Public function
    alert( this.x + y );    
  }
}

obj.print();

与其他模块模式相比,这有任何缺点吗? (对于JSLint说odd construct at line 1

2 个答案:

答案 0 :(得分:1)

如果您只需要聚合范围,请使用自执行匿名函数:

var obj = (function () {
  var y = 10;                 // Private variable

  return {
    x: 25,                    // Public variable

    print: function () {      // Public function
      alert( this.x + y );    
    }
  }
})();

obj.print();

自执行匿名函数与创建匿名类实例之间的差异仅在于意识形态。 SEAF是一次性的,而且是多次使用。 BTW实际上同样的事情发生在两个时代。当你向函数调用new时,它会返回一个属性为this的新对象,它与我们在SEAF中看到的一样。

答案 1 :(得分:0)

当您直接在对象上设置print(使用this.print)时,您会使用一些内存来存储每个对象的属性(此处为方法)(类的实例化)。在原型上定义它时,所有实例将共享相同的属性(因此内存相同)。

使用inheritance也会遇到一些麻烦。

如果您只想要"类"的一个实例,那么您当然应该使用模式单例。但是对于更强大的解决方案,我建议您尝试实现依赖注入组件的框架,因为singleton is almost an anti-pattern。您可以在我的配置文件中找到此类框架的示例(如果没有node.js服务器,则无法使用它,但这是一个很好的示例)。

最后,您可以像下面这样定义您的类:



var Class = function() {
  this._x = 25;                // Public variable
  this._y = 10;               // Private variable
}

Class.prototype.print = function() {
  alert(this._x + this._y); 
}

Object.defineProperty(Class.prototype, 'x', {
    get: function() { return this._x; }
});

var obj = new Class();
obj.print();

alert(obj.x);
alert(obj.y);