vue源碼分析之前涉及的一些小知識點,記錄一下:
- [ ].slice.call(lis) :將偽數(shù)組轉(zhuǎn)化成真數(shù)組。
- node.nodeType:得到節(jié)點類型。
-
Obj.defineProperty:定義屬性
defineProperty(obj,propertyName,{ }) :給對象添加屬性(指定描述符)
屬性描述符:
- 數(shù)據(jù)描述符
configurable:是否可以重新定義
enumerable:是否可以枚舉
value:初始值
writable:是否可以修改屬性值- 訪問描述符
get:回調(diào)函數(shù),根據(jù)其他相關(guān)的屬性動態(tài)計算得到當(dāng)前屬性值。
set:回調(diào)函數(shù),監(jiān)視當(dāng)前屬性值的變化,更新其他相關(guān)的屬性值。
const obj = {
firstName:'A',
lastName:'B'
}
// 給obj添加fullName屬性 同時改變obj中firstName,lastName時 fullName也改變 ,同理,改變
//firstName時,firstName,lastName也改變
Object.defineProperty(obj,'fullName',{
get(){
return this.firstName + '-' +this.lastName;
},
set(value){
const names = value.split('-');
this.firstName = names[0] ;
this.lastName = names[1] ;
}
})
console.log(obj.fullName) //A-B
obj.firstName = 'C';
obj.lastName = 'D';
console.log(obj.fullName) //C-D
obj.fullName = 'E-F';
console.log(obj.firstName) //C
console.log(obj.lastName) //D
Object.defineProperty(obj,'fullName2',{
configurable:false, //不能重新定義
enumerable:false, //不能枚舉
value:'G-H',
writable:true //不能修改屬性值
})
- Object.keys(obj):得到對象自身可枚舉屬性組成的數(shù)組。
Object.keys(obj); // [firstName, lastName]
- obj.hasOwnProperty(prop):判斷prop是否是obj自身的屬性。
- DocumentFragment :文檔碎片(高效批量更新多個節(jié)點 )。
document:對應(yīng)顯示的頁面,包含n個element,一旦更新document內(nèi)部的某個元素,界面也會更新(DocumentFragment可以解決這個問題)。
DocumentFragment: 內(nèi)存中保存n個element容器對象(不與界面關(guān)聯(lián)),如果更新framgnet中的某個element,界面不會更新。(批量更新)
- vue數(shù)據(jù)代理:通過vm對象來代理data對象中所有屬性的操作。
- 通過Object.defineProperty()給vm添加與data對象的屬性對應(yīng)的屬性描述符。
- 所有添加的屬性都包含getter/setter。
- getter/setter內(nèi)部操作data對應(yīng)的屬性數(shù)據(jù)。