JS对象方法——Object.defineProperty()
JS对象方法——Object.defineProperty()我们都知道Vue内部通过Object.defineProperty方法属性拦截的方式,把data对象里每个数据的读写转化成getter/setter,当数据变化时通知视图更新实现双向数据绑定。可我们真的了解Object.defineProperty()吗。Object.defineProperty() 方法会直接在一个对象上定义一个..
JS对象方法——Object.defineProperty()
我们都知道Vue内部通过Object.defineProperty
方法属性拦截的方式,把data对象里每个数据的读写转化成getter/setter,当数据变化时通知视图更新实现双向数据绑定。可我们真的了解Object.defineProperty()
吗。
Object.defineProperty()
方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。它的具体用法值得我们深究。
语法
Object.defineProperty(obj, prop, descriptor)
参数 | 描述 |
---|---|
obj | 要在其上定义属性的对象。 |
prop | 要定义或修改的属性的名称。 |
descriptor | 将被定义或修改的属性描述符。 |
并且它会返回被传递给函数的对象。以下为示例:
var obj = {}; // 创建一个新对象
// 在对象中添加一个属性与数据描述符的示例
Object.defineProperty(obj, "price", {
value : 999,
writable : true,
enumerable : true,
configurable : true
});
// 对象obj拥有了属性price,值为999
descriptor
属性描述符
通过示例我们很快了解obj
和prop
参数。但descriptor
参数比较复杂,它可以通过设置一些值来描述这个属性。
对象里目前存在的属性描述符有两种主要形式:数据描述符和存取描述符。
数据描述符是一个具有值的属性,该值可能是可写的,也可能不是可写的。
存取描述符是由getter-setter函数对描述的属性。描述符必须是这两种形式之一;不能同时是两者。
-
数据描述符和存取描述符均具有以下可选键值(默认值是在使用Object.defineProperty()定义属性的情况下):
值 说明 configurable 当且仅当该属性的 configurable 为 true 时,该属性 描述符
才能够被改变,同时该属性也能从对应的对象上被删除。默认为 false。enumerable 当且仅当该属性的 enumerable
为true
时,该属性才能够出现在对象的枚举属性中。enumerable
定义了对象的属性是否可以在for...in
循环和Object.keys()
中被枚举。默认为 false。 -
数据描述符同时具有以下可选键值:
值 说明 value 该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefined。 writable 当且仅当该属性的 writable
为true
时,value
才能被赋值运算符改变。默认为 false。 -
存取描述符同时具有以下可选键值:
值 说明 get 一个给属性提供 getter 的方法,如果没有 getter 则为 undefined
。当访问该属性时,该方法会被执行,方法执行时没有参数传入,但是会传入this
对象(由于继承关系,这里的this
并不一定是定义该属性的对象)。默认为 undefined。set 一个给属性提供 setter 的方法,如果没有 setter 则为 undefined
。当属性值修改时,触发执行该方法。该方法将接受唯一参数,即该属性新的参数值。默认为 undefined。 -
描述符可同时具有的键值
属性描述符 configurable enumerable value writable get set 数据描述符 Yes Yes Yes Yes No No 存取描述符 Yes Yes No No Yes Yes 如果一个描述符不具有value,writable,get 和 set 任意一个关键字,那么它将被认为是一个数据描述符。如果一个描述符同时有(value或writable)和(get或set)关键字,将会产生一个异常。
更多推荐
所有评论(0)