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);
}