You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
如果设置了 set 或 get, 就不能设置 writable 和 value 中的任何一个,否则报错
vara={};Object.defineProperty(a,"abc",{value: 123,get: function(){returnvalue;}});//Uncaught TypeError: Invalid property descriptor. Cannot both specify accessors and a value or writable attribute, #<Object> at Function.defineProperty
答案:这是 js 中一个非常重要的方法,ES6 中某些方法的实现依赖于它,VUE 通过它实现双向绑定,此方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象
解析:
语法
Object.defineProperty(object, attribute, descriptor)
descriptor
前两个参数都很明确,重点是第三个参数 descriptor, 它有以下取值
一个例子
因为 writable 和 enumerable 默认值为 false, 所以对 a.b 赋值无效,也无法遍历它
configurable
总开关,是否可配置,设置为 false 后,就不能再设置了,否则报错, 例子
writable
是否可重写
enumerable
属性特性 enumerable 定义了对象的属性是否可以在 for...in 循环和 Object.keys() 中被枚举
enumerable 改为 false
set 和 get
如果设置了 set 或 get, 就不能设置 writable 和 value 中的任何一个,否则报错
对目标对象的目标属性 赋值和取值 时, 分别触发 set 和 get 方法
上面的代码中,给 a.b 赋值,b 的值也跟着改变了。原因是给 a.b 赋值,自动调用了 set 方法,在 set 方法中改变了 b 的值。vue 双向绑定的原理就是这个。
扩展:参考
The text was updated successfully, but these errors were encountered: