JavaScript 创建对象的七种模式详解
本文系统介绍JavaScript中创建对象的多种模式,包括工厂模式、构造函数模式、原型模式及其组合使用。详细解析各模式的实现原理、优缺点及适用场景,涵盖态原型、寄生构造函数与稳妥构造函数模式,帮助开发者根据实际需求选择最优方案,提升代码封装性与复用性。
JavaScript对象创建模式概述
在JavaScript中,存在多种创建对象的方式,通过这些模式可以操作对象所包含的属性与方法。
通常约定构造函数名称的首字母大写,而非构造函数(普通函数)名称首字母小写。构造函数与普通函数的本质区别仅在于调用方式:任何函数若通过new关键字调用,即可视为构造函数;若不通过new调用,则其行为与普通函数无异。
以下是对几种常见对象创建模式的深入解析:
工厂模式与构造函数模式
工厂模式:定义一个普通函数,在函数内部创建一个Object实例,为其添加属性与方法并赋值,最后返回该对象。此模式的主要局限在于无法识别对象的具体类型。
构造函数模式:通过构造函数使用this关键字进行属性赋值。每次创建实例时,都会重新创建方法,导致相同的方法被多次实例化,造成资源浪费。若将方法移至全局环境以解决此问题,则会破坏封装性。这一问题可通过原型模式加以优化。
原型模式及其关系图解
原型模式:每个函数都拥有一个prototype属性,该属性是一个指针,指向一个对象。该对象包含由构造函数创建的所有实例所共享的属性和方法。
原型对象、构造函数与实例之间的关系如下图所示:

图解说明1:构造函数及其创建的实例,它们的prototype属性均指向构造函数的原型对象。
图解说明2:构造函数的原型对象包含constructor属性,该属性指向构造函数本身。
图解说明3:构造函数的原型对象所包含的所有属性与方法,均可由该构造函数创建的所有实例共享。
若使用对象字面量重写原型对象,constructor属性将指向Object构造函数。若需使其指向特定的构造函数(如Person),则需手动修改原型对象的constructor属性值,例如设置为constructor: Person。如此,即使原型对象被重写,其constructor仍指向Person构造函数。
若先创建实例,随后直接添加属性或方法,实例可以直接访问这些新添加的内容。
若先创建实例,随后重写原型对象,则构造函数的prototype将指向新的原型对象,而之前创建的实例的prototype仍指向最初的原型对象。因此,已有实例无法访问新原型对象中的新属性或新方法。
组合模式与动态原型模式
原型对象包含的是共享的属性和方法,这意味着每个实例都拥有这些信息,导致实例间缺乏差异,且无法传递参数,这往往不符合实际需求。每个实例既需要共同信息,又需要独立信息,因此通常组合使用构造函数模式与原型模式。
以下是构造函数模式与原型模式组合使用的具体示例:

动态原型模式:将独立的构造函数与其原型对象结合,在构造函数内部初始化原型,并为其添加方法。

若该方法尚不存在,则将其添加到原型对象上。该方法仅在初始化原型时执行,且仅执行一次。
寄生与稳妥构造函数模式
寄生构造函数模式:与工厂模式类似,区别在于寄生构造函数模式是一个构造函数,通过new关键字创建实例。
稳妥构造函数模式:不包含公共属性,其方法不引用this。创建实例时不使用new关键字,只能通过特定方法访问属性(即传入的数据)。
以上关于JavaScript创建对象多种模式的介绍即为全部内容,旨在为开发者提供参考,欢迎支持。
JS语法错误会阻止加载吗?区分SyntaxError与资源加载失败
2026-11-05 16:08:46
JavaScript常见SyntaxError语法错误排查与修复方法
2026-11-05 13:58:44
JS中slice、substring和substr截取字符串的区别
2026-11-05 13:43:47
JS 转 TS 手动迁移最佳实践:从配置 tsconfig 到消除 any 类型
2026-11-05 11:53:32
为什么JS数组push后得到的是数字而不是数组?
2026-11-05 09:59:18
