本文对比了JavaScript中两种常见的对象创建方式:对象字面量{}与构造函数function(){}。对象字面量适用于单例模式,无需new关键字,效率较高且易于扩展;构造函数模式利用闭包实现私有成员封装,支持通过new实例化多个独立对象。两者适用场景不同,前者适合无需封装的单例,后者适合需要状态隔离和私有方法的批量对象创建。
对象字面量{}的使用场景
浏览众多JavaScript项目时,常发现开发者倾向于使用对象字面量{}来构建对象。
以jQuery和TinyMCE等知名库为例,它们普遍采用这种简洁的对象定义方式。
具体实现代码示例如下:
var Dialog =
{
init : function() { .... },
insert : function() { .... },
pop : function() { .... }
};
//调用就是:
Dialog.init(); 构造函数function(){}的封装优势
相比之下,个人更习惯使用function构造函数结合闭包的方式,因为这种方式能更方便地管理内部私有成员(如变量和函数)。
具体实现代码示例如下:
function classDialog()
{
var box = "sdfsdf"; //init, insert等函数中调用公共变量就会很方便, 调用内部函数也很方便(如可以直接调用 search()).
this.init = function() { .... };
this.insert = function() { .... };
this.pop = function() { .... };
function search() { .... }
}
var Dialog = new classDialog();
Dialog.init(); 观察TinyMCE源码,当需要在init方法中调用私有函数时,通常会在init内部重新定义该函数。这种写法导致私有函数仅能在init中访问,其他公共方法无法复用该私有逻辑。
目前尚未见到私有函数被多个公共方法共同调用的典型示例。
两种方式的本质区别与选择建议
因此产生疑问:既然function(){}闭包模式在创建对象时具有封装便利性的优势,为何对象字面量{}依然被广泛采用?
这是否意味着function(){}创建的对象存在某些固有缺陷?
回复:
针对直接使用{}创建对象的情况,若仅需创建极少数对象且无需严格封装,这种方式完全可行;而在需要批量创建对象时,使用构造函数并通过new实例化则更为便捷。具体选择应视实际需求而定。
这两种方式在本质上是完全不同的。
对象字面量{}本质上可视为一种单例模式。
而function(){}构造函数每次执行new操作时,都会返回一个全新的、独立的对象实例。
正如前述观点,{}方式效率更高,且无需使用new关键字。由于它是全局固定的对象,后续扩展属性或方法十分灵活。
通常情况下,{}确实具有更高的执行效率和更简单的使用方式。然而,若需要隐藏某些内部方法或变量,不对外暴露,则使用function构造函数更为合适。