对象是由多个名/值对组成的无序的集合
var obj = {
test: 'hello'
};
1.对象的已有的属性添加特性描述
Object.defineProperty(obj,'test',{
//是否可以删除(是否可以delete删除)目标属性或是否可以再次修改属性的特性
//(writable,configurable,enumerable)。ture可以,默认false
configurable:true|false,
// 此属性是否可以被枚举(for in 或Object.keys());ture可以默认false
enumerable:true|false,
value: '任意类型的值',
writable:true|false //属性的值是否可以被重写,true可以,默认false
});
2.对象新添加的属性的特性描述
Object.defineProperty(obj,'test',{
//是否可以删除(是否可以delete删除)目标属性或是否可以再次修改属性的特性
//(writable,configurable,enumerable)。ture可以,默认false
configurable:true|false,
// 此属性是否可以被枚举(for in 或Object.keys());ture可以默认false
enumerable:true|false,
value: '任意类型的值',
writable:true|false //属性的值是否可以被重写,true可以,默认false
});
存取器描述
var obj = {};
Object.defineProperty(obj,"newKey",{
get:function (){} | undefined,
set:function (value){} | undefined
configurable: true | false
enumerable: true | false
});
注意:当使用了getter或setter方法,不允许使用writable和value这两个属性
var obj = {};
var initValue = 'hello';
Object.defineProperty(obj,"newKey",{
get:function (){
//当获取值的时候触发的函数
return initValue;
},
set:function (value){
//当设置值的时候触发的函数,设置的新值通过参数value拿到
initValue = value;
}
});
//获取值
console.log( obj.newKey ); //hello
//设置值
obj.newKey = 'change value';
console.log( obj.newKey ); //change value
兼容性
在ie8下只能在DOM对象上使用,尝试在原生的对象使用 Object.defineProperty()会报错。这也是vue不支持ie8以下的原因