- 做者:陳大魚頭
- github: KRISACHAN
es5
實現const
,據做者反饋 這一題全部的面試者都沒有回答出來,感受挺惋惜的,其實這是一道比較簡單的題目,可是因爲涉及到了一些Object對象屬性描述符的知識,這些描述符每每用到的場景很少,因此不容易記住。configurable | enumerable | value | writable | get | set | |
---|---|---|---|---|---|---|
數據描述符 | Yes | Yes | Yes | Yes | No | No |
存取描述符 | Yes | Yes | No | No | Yes | Yes |
因爲ES5環境沒有block的概念,因此是沒法百分百實現const,只能是掛載到某個對象下,要麼是全局的window,要麼就是自定義一個object來當容器git
var __const = function __const (data, value) {
window.data = value // 把要定義的data掛載到window下,並賦值value
Object.defineProperty(window, data, { // 利用Object.defineProperty的能力劫持當前對象,並修改其屬性描述符
enumerable: false,
configurable: false,
get: function () {
return value
},
set: function (data) {
if (data !== value) { // 當要對當前屬性進行賦值時,則拋出錯誤!
throw new TypeError('Assignment to constant variable.')
} else {
return value
}
}
})
}
__const('a', 10)
console.log(a)
delete a
console.log(a)
for (let item in window) { // 由於const定義的屬性在global下也是不存在的,因此用到了enumerable: false來模擬這一功能
if (item === 'a') { // 由於不可枚舉,因此不執行
console.log(window[item])
}
}
a = 20 // 報錯
複製代碼
Vue目前雙向綁定的核心實現思路就是利用Object.defineProperty對get
跟set
進行劫持,監聽用戶對屬性進行調用以及賦值時的具體狀況,從而實現的雙向綁定~~github