一文秒懂JavaScript中对象的7种创建方式
发布网友
发布时间:2024-10-05 12:05
我来回答
共1个回答
热心网友
时间:2024-10-23 16:11
工厂模式:通过工厂函数,根据传入参数创建一个person对象。多次调用此函数会返回包含相同属性与方法的对象。但此模式无法识别对象类型。
构造函数模式:使用new关键字创建对象,构造函数首字母大写以示区分。与工厂模式不同之处在于:无需显示创建对象,属性值和方法直接赋给this,无需return语句,可使用instanceof检测对象类型。new关键字创建对象分为四步。
构造函数模式的不足:每个方法都在实例上重新创建,不同实例的同名方法并非相同。
原型模式:将属性与方法写在prototype中,实例共享。新增方法会覆盖prototype上的同名方法。代码优先查找实例属性,然后查找prototype。使用delete操作符可删除实例属性。原型链动态性意味着对原型对象的修改会立即反映在实例上。但若重写整个原型对象,切断了构造函数与原型的联系,原先的实例仍引用原始原型。原型模式缺点:省略参数传递,导致所有实例共用相同属性值。共享属性与方法适用于方法,但对包含引用类型值的属性有负面影响。
构造函数模式与原型模式结合:用构造函数定义实例属性,原型定义共享属性与方法。每个实例有自己副本的实例属性,共享对方法的引用,节省内存,支持参数传递。
动态原型模式:构造函数仅初始化原型所需方法,以避免重复代码,仅在初次调用时执行。
寄生构造函数模式:创建函数封装对象创建代码并返回对象,除了使用new操作符,与工厂模式相似。适用于特殊情况下为对象创建构造函数。如创建具有额外方法的特殊数组。返回的对象与构造函数或原型属性无关,不能通过instanceof确定类型。
稳妥构造函数模式:创建的稳妥对象除了使用speakName方法外无法访问name值。适合在安全环境中使用,如ADsafe和Caja提供环境。此类对象与构造函数无关联,不能通过instanceof确定类型。
每种模式有其特点与适用场景,理解它们之间的区别能更灵活地在实际编程中运用。注意在适当情况下选择合适模式,避免使用可能导致问题的模式。