对Object.defineProperty()的一点理解
Vue2.x中,Object.defineProperty()实现响应式的原理的核心。
静态方法Object.defineProperty(obj, prop, descriptor)
,其可以通过定义属性的元数据信息精确地控制属性的行为。简单的来说可以给对象添加或者删除属性值。
方法名:Object.defineProperty(obj, prop, descriptor)参数
obj
Object,必须,要在其上定义属性的对象。prop
String|Symbol,必须,要定义或修改的属性的名称。descriptor
Object,必须,将被定义或修改的属性描述符。
返回值: Object,返回被传递给函数的对象obj。
属性描述符分为数值描述符和存取描述符
(1)数据描述符和存取描述符均有以下键值:
configurable:当且仅当该属性的 configurable 为 true 时,才能够再次修改该属性的属性描述符,同时该属性也能从对应的对象上被删除。默认为 false。
*enumerable:当且仅当该属性的enumerable为true时,该属性才能够出现在对象的枚举属性中。默认为 false。
(2)数据描述符可选键值:
value:该属性的初始值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefined。
writable: 当且仅当该属性的writable为true时,该属性才能被写入值。默认为 false。
(3)存取描述符可选键值:
get:一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。当访问该属性时,该方法会被执行,方法执行时没有参数传入,但是会传入this对象(由于继承关系,这里的this并不一定是定义该属性的对象)。默认为 undefined。
set:一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。当属性值修改时,触发执行该方法。该方法将接受唯一参数,即该属性新的参数值。默认为 undefined。
代码示例
(1)创建属性
<script> const Obj = {}; // 向对象Obj中添加一个属性a,并设置数据描述符 Object.defineProperty(Obj, "a", { value: 100, // 默认值1 writable: true, // 可写 enumerable: true, // 可枚举 configurable: true // 可以再次修改属性描述符 }); // 对象Obj有了属性a,其值为1 console.log(Obj.a) // 输出: 1 </script>复制代码
(2)get、set存取描述符
const Obj = {}; let v = null; Object.defineProperty(Obj, 'a', { get: function () { return v; }, set: function (newValue) { v = newValue; } }); Obj.a = 1000; console.log(Obj.a); // 输出: 1,表示属性a的getter和setter均生效
作者:Zgh
链接:https://juejin.cn/post/7018155599791816718