读书笔记--JavaScript设计模式:Constructor模式(创建对象的方法)

个人主页:http://laichuanfeng.com/

Object.defineProperty创建对象的用法(可继承的对象)

基本用法:

Object.defineProperty(newObject,"someKey",{
value:"for more control of the property's behavior,
writeable:true,
enumerable:true,
configurable:true
})

这样用起来麻烦,包装成函数:

var defineProp=function(obj,key,value){
	var config={};
	config.value=value;
	Object.defineProperty(obj,key,config);
}

var person=Object.create(null);//创建一个新的对象

defineProp(person,"car","Delorean");
defineProp(person,"dateOfBirth","1992");
defineProp(person,"hasBeard",false);

//用这种方式申明的属性也可以被继承
person.firstname="Mark";

 // 继承person的属性
var driver=Object.create(person);

defineProp(driver,"topSpeed","100mph");

console.log(driver.dateOfBirth);
console.log(driver.topSpeed);
console.log(driver.firname);
 

输出:

现在,我们做点别的,看看将person打印输出:

<span style="font-size:18px;">console.log(person);</span>
输出:

我们只得到了通过“.”运算符设置的属性与属性值。回看Object.defineProperty方法,除了一个value可以设置,我们还可以设置writeable(可写),enumerable(可枚举),configurable(可配置),问题就出来enumerable上,如果未设置,默认是false,即不可枚举,不能通过console.log()方法显示出来,也不能通过for...in...方法遍历,所以我们的函数修改为:

var defineProp=function(obj,key,value){
	var config={};
	config.value=value;
	/*默认为false,不可遍历*/
	config.enumerable=true;
	Object.defineProperty(obj,key,config);
}

输出:

同样,对于writeable属性,如果我们未设置,对象的属性值初始化之后是不能修改的,

比如我们修改car属性

person.car="BMW"
输出:

与上面的一致,未被修改,修复的方法同理:

var defineProp=function(obj,key,value){
	var config={};
	config.value=value;
	config.writable=true;
	/*默认为false,不可遍历*/
	config.enumerable=true;
	config.configurable=true;
	Object.defineProperty(obj,key,config);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值