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

来源:互联网 发布:photoshop最新软件版本 编辑:程序博客网 时间:2024/06/04 01:25

个人主页: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
原创粉丝点击