【红宝书笔记】 创建对象的几种方法

本文详细解析了JavaScript对象属性的四种特性,并对比了三种主要的创建模式:工厂模式、构造函数模式和原型模式,阐述了它们各自的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前看for-in的时候不解为什么这是用来遍历对象属性的,但是有些属性却遍历不出来,但是单独用in判断是否可访问一个属性名的时候发现返回的是true。。。

对象的属性有四种特性,[[Configurable]]是否能够通过delete删除,[[Enumerable]]是否能通过for-in访问,[[Get]]在读出属性时调用的函数,[[Set]]在写入属性时调用的函数。程序员添加的属性默认都是可删除,可用for-in的。所以这样就解释了为什么有些属性用for-in访问不出来。

言归正传。。。

创建对象主要有三个基本的模式,剩下的几个模式都是基于这三个基本的模式。

1.工厂模式

function gene(name, age){
	var obj = new Object();
	obj.name = name;
	obj.age = age;
	obj.say = function(){
		console.log(this.name, this.age);
	}
	return obj;
}
var x = gene();

每调用一次gene,就产生一个新的对象。跟批量生产一样。这样产生的问题就是不能确定对象的类型

2.构造函数模式

function gene(name, age){
	this.name = name;
	this.age = age;
	this.say = function(){
		console.log(this.name, this.age);
	}
}
var x = new gene();

使用new方法,把gene函数当做构造函数来使用。new的过程有四步:

1.创建一个新对象

2.把this指针指向这个对象

3.执行构造函数中的代码

4.返回新对象

构造函数很方便,但是由于有些执行相同功能的函数创建了多次,浪费了空间。

3.原型模式

利用函数的prototype属性,可以把执行相同功能的函数放在prototype中共享一份代码。节约资源。但是这样会导致一些引用类型的对象在不同对象操作的时候修改了值。

以下是混合模式:

1.构造函数模式和原型模式

把不能共享的,如引用类型的值放在构造函数中,可以共享的放在原型中

2.动态原型

通过一些参数的传入判断是否需要把一些值放在原型中共享

3.寄生构造

function gene(name, age){
	var obj = new Object();
	obj.name = name;
	obj.age = age;
	obj.say = function(){
		console.log(name, age);
	}
	return obj;
}
寄生模式第一眼看上去就像工厂模式,但是使用的时候是用new操作符创建的对象。这样可以创建具有一些额外方法的对象。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值