Object.defineProperty()

两种定义形式的区别

1.直接定义

1
2
3
let obj = {}
obj.name = 'jack'
//obj['name'] = 'jack'

等同于

1
2
3
4
5
6
7
let obj = {}
Object.defineProperty(obj,'name',{
value:'jack',
writable:true,
configurable:true,
enumberable:true
})

2.Object.defineProperty()定义

1
2
3
Object.defineProperty(obj,'name',{
value:'jack'
})

等同于

1
2
3
4
5
6
7
let obj = {}
Object.defineProperty(obj,'name',{
value:'jack',
writable:false,
configurable:false,
enumberable:false
})

Object.defineProperty()语法说明

Object.defineProperty(obj, prop, desc)

1
2
3
obj : 需要定义属性的当前对象
prop : 当前需要定义的属性名
desc : 属性描述符
描述符 configurable enumerable value writable get set
数据描述符 Yes Yes Yes Yes No No
存取描述符 Yes Yes No No Yes Yes

描述符参数实例说明

get & set

1
2
3
4
get
一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。当访问该属性时,该方法会被执行,方法执行时没有参数传入,但是会传入this对象(由于继承关系,这里的this并不一定是定义该属性的对象)。 默认为 undefined。
set
一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。当属性值修改时,触发执行该方法。该方法将接受唯一参数,即该属性新的参数值。 默认为 undefined。
1
2
3
4
5
6
7
8
9
10
let Person = {}
let temp = null
Object.defineProperty(Person, 'name', {
get: function () {
return temp
},
set: function (val) {
temp = val
}
})

configurable

1
2
3
4
5
当且仅当该属性的 configurable 为 true 时,该属性描述符才能够被改变,同时该属性也能从对应的对象上被删除。默认为 false。

这个属性起到两个作用:
(1)目标属性是否可以使用delete删除
(2)目标属性是否可以再次设置特性

enumerable

1
当且仅当该属性的enumerable为true时,该属性才能够出现在对象的枚举属性中。默认为 false。

value

1
该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefined。

writable

1
当且仅当该属性的writable为true时,value才能被赋值运算符改变。默认为 false。
坚持原创技术分享,您的支持将鼓励我继续创作!