JavaScript中对象字面量{}与构造函数function(){}的对比分析

作者:函数茶馆

时间:2026-10-26

浏览:109

本文对比了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构造函数更为合适。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章