Object.defineProperty()

2018-09-17  本文已影响25人  取个帅气的名字真好

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"
上一篇 下一篇

猜你喜欢

热点阅读