最近很慌, 想看原始碼, 先把簡單的相關概念理一理
object.defineproperty
首先, 概念 :
object.defineproperty() 方法會直接在乙個物件上定義乙個新屬性,或者修改乙個物件的現有屬性, 並返回這個物件。沒啥好說的, 直接上例子
// 定義乙個物件
const obj =
// 資料描述符-----------------------------------------------
// 新增乙個屬性
object.defineproperty(obj, 'age', )
// 不可重新配置
object.defineproperty(obj, 'age', ) // 報錯
// 不可刪除
delete obj.age // false
console.log(obj.age) // 18
// 不可列舉
object.keys(obj) // ["firstname", "lastname"]
// 不可寫
obj.age = 17
console.log(obj.age) // 18
// 訪問描述符-----------------------------------------------
object.defineproperty(obj, 'fullname', ,
set(value)
})obj.fullname // d-z
obj.fullname = 'a-b'
obj.lastname // b
obj.firstname // a
configurable: false
不可重新定義, 也就是說再執行object.defineproperty(obj, 'age', )
將會報錯, 並且, 屬性不可刪除
enumerable: false
不可列舉, 也就是再執行object.keys()
或for in
等將取不到該屬性
value:18
值
writable: false
不可寫, 也就是對age
賦值操作將不會生效, 但不會報錯
get
取值操作 ,function
, 預設undefined
set
屬性值修改時,觸發執行該方法 ,function
, 預設undefined
以上這一些屬性, 稱為描述符, 需要注意的是, 當使用了getter或setter方法,不允許使用writable和value這兩個屬性
get set 看起來就很像vue的計算屬性
偽陣列偽陣列 (arraylike) ,又稱類陣列。是乙個類似陣列的物件,但是有如下幾個特徵。
按索引方式儲存資料
0: ***, 1: ***, 2: ***...
具有length屬性
但是length屬性不是動態的,不會隨著成員的變化而改變
不具有陣列的push(), foreach()等方法
arraylike.__proto__ === object.prototype;
//true
arraylike instanceof
object
;//true
arraylike instanceof
array
;//false
以下是常見偽陣列:
轉換為真陣列方法
遍歷偽陣列存入真陣列
array.prototype.splice.call(arraylike)
array.from(arraylike)
[…arraylike]
原型繼承,arraylike.proto=array.prototype
其他工具庫中的方法,如jquery中的makearray() toarray()等
nodetype
元素,屬性,文字等, 都實現了 node 介面, 都會有nodetype屬性, 它標識了節點屬於的 型別
常見的有:
1 -> 元素 節點
3 -> 文字節點
8 -> 注釋節點
11 -> documentfragment 節點
class
="my"
>
123>
456span
>
>
789span
>
div>
上面的html片段, 分別用childnodes和children取值, 結果分別是什麼呢
document.
queryselector
('.my'
).childnodes // nodelist(5) [text, span, text, span, text]
document.
queryselector
('.my'
).children // htmlcollection(2) [span, span]從圖中可以看到, my div下, 包含了5個node, 其中123, 以及兩個小紅框位置的換行符, 屬於 textnode , span標籤屬於 elementnode
childnodes和children結果分別是節點list 和 子元素 list
documentfragment
文件片段介面,表示乙個沒有父級檔案的最小文件物件.
通常的用例是建立文件片段,將元素附加到文件片段,然後將文件片段附加到dom樹。在dom樹中,文件片段被其所有的子元素所代替。
因為文件片段存在於記憶體中,並不在dom樹中,所以將子元素插入到文件片段時不會引起頁面回流(對元素位置和幾何上的計算)。因此,使用文件片段通常會帶來更好的效能。
let content = document.
createdocumentfragment()
let el = document.
queryselector
('.nums'
)content.
(el)
// 這個時候 .nums 元素會從頁面消失, 存入content這個fragment片段proxy
proxy用於修改某些操作的預設行為,也可以理解為在目標物件之前架設一層攔截,外部所有的訪問都必須先通過這層攔截,因此提供了一種機制,可以對外部的訪問進行過濾和修改。這個詞的原理為**,在這裡可以表示由它來「**」某些操作,譯為「**器」。
var obj =
newproxy(,
!`)return reflect.
get(target, key, receiver)},
set(target, key, value, receiver)!`)
return reflect.
set(target, key, value, receiver)}}
)
上面**對乙個空物件架設了一層攔截,重新定義了屬性的讀取(get)和設定(set)行為。對設定了攔截行為的物件obj,去讀寫它的屬性,用自己的定義覆蓋了語言的原始定義,執行得到下面的結果
obj.count =
1// setting count!
++obj.count
// getting count!
// setting count!
// 2
3 1 學習nginx原始碼前的準備工作
winrar core下nginx的main函式 共享目錄不見了,一般可能是虛擬機器自帶的工具 vmware tools可能有問題 vmware tools是vmware虛擬機器自帶的一系列的增強工具,檔案共享功能就是wmware tools工具裡邊的 a 虛擬機器 重新安裝vmware tools...
spring原始碼分析 準備工作
該專案會不定期更新,所以 上可能會有變化。spring版本 5.1.0.build snapshot 會定期合併master分支,該版本號會有改變 在basebean包下建立 multiconditionbean 具體 如下 xml具體配置內容如下圖 通過以上配置就可以建立測試 進行測試了,測試 包...
迎新前準備工作
從開學至今,我校的csdn高校俱樂部高年級 輔導 領隊 隊伍不斷壯大,已經有來自各個學院的各個專業的30多位同學加入了我們的行列!為了能讓十一後的招新工作順利圓滿的進行,有不少同學選擇留校繼續工作!我們向所有為我校csdn高校俱樂部做出貢獻的同學表示感謝!當然還要感謝csdn寄過來的程式設計師雜誌!...