Object.defineProperty(obj, prop, descriptor)
参数说明
obj:必需。目标对象
prop:必需。需定义或修改的属性的名字
descriptor:必需。目标属性所拥有的特性
1.只对对象属性的value起作用,value有值则为vulue的值,否则则为undefined
var obj = {}
// 第一种情况:不设置value属性
Object.defineProperty(obj,"newKey",{
});
console.log( obj.newKey ); //undefined
// 第二种情况:设置value属性
Object.defineProperty(obj,"newKey",{
value: "hello"
});
console.log( obj.newKey ); //hello
2.value值是否可以重写,writable设置为true可以被重写;设置为false,不能被重写。默认为false。
var obj = {}
//第一种情况:writable设置为false,不能重写。
Object.defineProperty(obj,"newKey",{
value: "hello",
writable: false
});
//更改newKey的值
obj.newKey = "change value";
console.log( obj.newKey ); //hello
//第二种情况:writable设置为true,可以重写
Object.defineProperty(obj,"newKey",{
value: "hello",
writable: true
});
//更改newKey的值
obj.newKey = "change value";
console.log( obj.newKey ); //change value
3.属性是否可以被枚举,enumerable设置为true可以被枚举;设置为false,不能被枚举。默认为false
var obj = {}
// 第一种情况:enumerable设置为false,不能被枚举。
Object.defineProperty(obj,"newKey",{
value: "hello",
writable: false,
enumerable: false
});
// 枚举对象的属性
for( var attr in obj ){
console.log( attr );
}
//第二种情况:enumerable设置为true,可以被枚举。
Object.defineProperty(obj,"newKey",{
value: "hello",
writable: false,
enumerable: true
});
//枚举对象的属性
for( var attr in obj ){
console.log( attr ); //newKey
}
4.configurable设置为true可以被删除或可以重新设置特性;设置为false,则不可删除或重新设置特性。默认为false。
测试目标属性是否能被删除
var obj = {}
//第一种情况:configurable设置为false,不能被删除。
Object.defineProperty(obj,"newKey",{
value: "hello",
writable: false,
enumerable: false,
configurable: false
});
//删除属性
delete obj.newKey;
console.log( obj.newKey ); //hello
//第二种情况:configurable设置为true,可以被删除。
Object.defineProperty(obj,"newKey",{
value:"hello",
writable:false,
enumerable:false,
configurable:true
});
//删除属性
delete obj.newKey;
console.log( obj.newKey ); //undefined
测试是否可以再次修改特性
var obj = {}
//第一种情况:configurable设置为false,不能再次修改特性。
Object.defineProperty(obj,"newKey",{
value:"hello",
writable:false,
enumerable:false,
configurable:false
});
//重新修改特性
Object.defineProperty(obj,"newKey",{
value:"hello",
writable:true,
enumerable:true,
configurable:true
});
console.log( obj.newKey ); //报错:Uncaught TypeError: Cannot redefine property: newKey
//第二种情况:configurable设置为true,可以再次修改特性。
Object.defineProperty(obj,"newKey",{
value:"hello",
writable:false,
enumerable:false,
configurable:true
});
//重新修改特性
Object.defineProperty(obj,"newKey",{
value:"hello",
writable:true,
enumerable:true,
configurable:true
});
console.log( obj.newKey ); //hello