最近去面试,有问到vue底层的数据绑定的实现原理,没答出来,刚刚看明白,这里讲讲。
defineProperty有一下几个属性
-
configuragble
- 为true时才能改变它的值,默认 false,会有以下两个影响
1.无法delete 删除对象的属性。
var b={};Object.defineProperty(b,'name',{value:'scc'})
->Object {name: "scc"}
delete b.name
->false
2.无法通过在此defineProperty的方式设置。
var b={};Object.defineProperty(b,'name',{value:'scc'})
->Object {name: "scc"}
Object.defineProperty(b,'name',{value:'sccsss'})
->Uncaught TypeError: Cannot redefine property: name(…)
```
-
enumerable
- 为true时才能出现在对象可以枚举属性中(Object.keys()),默认 false
-
value
- 该属性对应的值,可以使任何有效的 JavaScript 值(数值,对象,函数等)。默认 undefined。
writable
为true时才能通过a.b=xx的形式去修改值,默认fasle
get (不能和value+writable共存)
查询对象的属性时会触发,比如a.b,则会触发这个函数,默认undefined。
set (不能和value+writable共存)
设置对象的属性时会触发,比如a.b=x,则会触发这个函数,默认undefined。
明天用这个属性试试双向绑定,今天太晚了,睡了