弁言
我之前常常运用 Vue,厥后不满足于仅仅运用它,我想相识其内部完成道理,所以就尝试进修其源码,获益匪浅。所以,假如你跟我一样,愿望应战这高难度的事变,那就开启这一系列吧!
基本上 MVVM 数据双向绑定的框架多数采用了大批的 Object.defineProperty 来完成。
Object.defineProperty 语法
Object.defineProperty(obj, prop, descriptor)
参数:
obj
须要定义属性的对象。
prop
需定义或修正的属性的名字。
descriptor
将被定义或修正的属性的形貌符。
返回值
返回传入函数的对象,即第一个参数obj。
形貌
该要领许可准确增添或修正对象的属性。平常情况下,我们为对象增添属性是经由过程赋值来建立并显现在属性罗列中(for...in
或 Object.keys
要领), 但这类体式格局增添的属性值可以被转变,也可以被删除
。而运用 Object.defineProperty() 则许可转变这些分外细节的默许设置。比方,默许情况下,运用 Object.defineProperty() 增添的属性值是不可转变的。
对象里现在存在的__属性形貌符__有两种重要情势:数据形貌符
和存取形貌符
。数据形貌符是一个具有可写或不可写值的属性。存取形貌符是由一对 getter-setter 函数功能来形貌的属性。形貌符必需是两种情势之一;不能同时是二者。
数据形貌符和存取形貌符均具有以下可选键值:
configurable
当且仅当该属性的 configurable 为 true 时,该属性形貌符才可以被转变,也可以被删除。默许为 false
。
enumerable
当且仅当该属性的 enumerable 为 true 时,该属性才可以出现在对象的罗列属性中。默许为 false
。
数据形貌符同时具有以下可选键值:
value
该属性对应的值。可所以任何有用的 JavaScript 值(数值,对象,函数等)。默许为 undefined
。
writable
当且仅当该属性的 writable 为 true 时,该属性才被赋值运算符转变。默许为 false
。
存取形貌符同时具有以下可选键值:
get
一个给属性供应 getter 的要领,假如没有 getter 则为 undefined。该要领返回值被用作属性值。默许为 undefined
。
set
一个给属性供应 setter 的要领,假如没有 setter 则为 undefined。该要领将接收唯一参数,并将该参数的新值分配给该属性。默许为 undefined
。