Object.defineProperty()方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象。
var obj = {a:1,b:2}
Object.defineProperty(obj,'xxx',{
get(){}, //读
set(value){} //写
})
只读不能写
var undefined = 1
undefined //undefined
能读能写
var o = {
name:'苏宋霖'
}
o.name //"苏宋霖"
o.name = '李四' //"李四"
o.name //"李四"
只读不能写。
只用get
var o = {
get name(){return '苏宋霖'} //只写get,不写set。表示只读不写
}
o.name //"苏宋霖"
o.name = '李四' //"李四"
o.name //"苏宋霖"
只读不能写
writable:
默认为false。
为'false',表示不可写。
为'true',表示可写的。value:属性对应的值。
var o = {}
Object.defineProperty(o,'name',{
writable:false, //writable属性设置为false时,该属性被称为“不可写
value:'苏宋霖' //name的默认值
})
o.name //"苏宋霖"
o.name ='李四' //"李四"
o.name //"苏宋霖"
让不可写变成可写
var o = {
name:'苏宋霖'
}
Object.defineProperty(o,'name',{writable:false})
o.name //"苏宋霖"
o.name = '李四' //"李四"
o.name //"苏宋霖"
Object.defineProperty(o,'name',{writable:true})
o.name //苏宋霖
o.name = '李四' //"李四"
o.name //"李四"
configurable 对象的属性是否可以被删除,以及除writable特性外的其他特性是否可以被修改。
var o = {}
Object.defineProperty(o,'name',{
configurable:false,
value:'苏宋霖'
})
//报错
Object.defineProperty(o,'name',{ configurable:true })
//报错
Object.defineProperty(o,'name',{value:'李四'})
//报错
Object.defineProperty(o, "name", {enumerable : true});
//报错
Object.defineProperty(o, "name", {set : function(){}});
//报错
Object.defineProperty(o, "name", {get : function(){return xxxx;}});
enumerable 不可枚举属性
var o = {a:1,c:3}
Object.defineProperty(o,'b',{value:2,enumerable:false})
//{a: 1, c: 3, b: 2}
for(let key in o){console.log(key)}
//a
//c
console.log(o)
//{a: 1, c: 3, b: 2}
批量操作
Object.defineProperties
var o = {}
Object.defineProperties(o,{
a:{value:'1111',writable:false},//a默认值是1111,不可修改
b:{value:'2222',writable:true}//b默认值是2222,可修改
})
o //{a: "1111", b: "2222"}
o.a //"1111"
o.a = '333' //"333"
o.a //"1111"
o.b //"2222"
o.b = '444' //"444"
o.b //"444"