我使用以下方法定义对象的实例而不定义类:
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
)
答案 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);