Object.defineProperty

Object.defineProperty

API
Object.defineProperty(obj, prop, descriptor)

  • obj:[Object] 目标对象
  • prop:[String] 需要定义或者修改的属性
  • descriptor:[Object] 配置属性 {enumerable,configurable,writable, get,set,value }

enumerable:[Boolean] default:true,true 时 forin是否可枚举
configurable:[Boolean]
value:default:undefined.
writable:[Boolean] default:true
set:[Function] default:undefined
get:[Function] default:undefined

configurable

configurable:[Boolean] : default:true。是否能被删除或者修改

1
2
3
4
5
6
7
8
9
10
11
12
13
var obj = Object.create(null)
Object.defineProperty(obj,'test',{
value:1,
configurable:false,
})
console.log(`delete test`)
delete obj.test //false
console.log(`test`,obj.test) //1
console.log(`set test data 2`)
obj.test = 2
console.log(`modify test value`,obj.test) //1

enumerable

enumerable:[Boolean] : default:true。是否能被枚举 forin,Object.keys

1
2
3
4
5
6
7
8
9
10
11
12
13
var obj = Object.create(null)
Object.defineProperty(obj,'test',{
value:1,
enumerable:false,
})
console.log(`Object.keys`,Object.keys(obj))
console.log(`-----forin start----`)
for(let p in obj){
console.log(p)
}
console.log(`-----forin end----`)

writable

为false时不能被重写

1
2
3
4
5
6
7
8
9
var obj = Object.create(null)
Object.defineProperty(obj,'test',{
value:1,
writable:false,
})
obj.test = 2
console.log(`set value 2 ,get value`,obj.test) //set value 2 ,get value 1

get/set

当使用了get/set方法,不允许使用writable和value这两个属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var obj = Object.create(null)
var value
Object.defineProperty(obj,'test',{
configurable: true,
enumerable: true,
get(){
console.log('get val',value)
return value
},
set(newVal){
console.log('set newVal',newVal)
value = newVal
}
})
obj.test = 1 //set newVal 1
obj.test //get val 1