大家好!
理解完物件繼承的方法,就要接續介紹今天的 Getter 和 Setter 了。
我們進入今天的主題吧!
出現賦值和取值的行為,就是存取行為。
let a;
a; // undefined
a = 'Felix'; // 'Felix'
a; // 'Felix'
/* or */
window.a; // undefined
window.a = 'Felix'; // 'Felix'
window.a; // 'Felix'
可賦值的情況下,新的值會是賦予的值,這是完全沒有爭議的,就像上方的舉例一樣。
Getter 和 Setter 顧名思義就是有 Get 和 Set 的行為,因此稱呼為「存取器」是最適合的了。
那麼存取器究竟如何使用呢?讓我們來看看:
document.cookie; // ''
document.cookie = 'name=Felix; max-age=9'; // 'name=Felix; max-age=9'
document.cookie; // 'name=Felix'
document.cookie = 'name=Felix; max-age=0'; // 'name=Felix; max-age=0'
document.cookie; // ''
對 document.cookie
賦值後,讀取的值會和賦予的值不同,這就是存取器的特色之一。document.cookie
乍看之下就是物件屬性,但是為什麼又和一般的物件屬性不同呢?
原因是因為 document.cookie
被充當函式使用了。
定義存取器和定義屬性只有稍微不同,就是要在存取器的名稱前加上 get
或 set
:
let clicking = {
limit: 10,
targets: [],
get status() {
return this.targets;
},
set status(t) {
if (this.targets.length < this.limit) return this.targets.push(t);
throw new Error('You have reached the maximum set limit.');
}
};
上方的存取器有什麼用途呢?讓我們來看看:
window.addEventListener('click', function (e) {
clicking.status = e.target;
console.log('Clicked!');
});
/* 點擊網頁第 10 次 */
// Log: Clicked!
clicking.status; // [...×10]
/* 點擊網頁第 11 次 */
// Uncaught Error: You have reached the maximum set limit.
clicking.status; // [...×10]
網頁被點擊的前 10 次都會將點擊到的元素推入
clicking.targets
陣列,並記錄Clicked!
於主控台。
但是,當點擊次數超過 10 次時,就會跳出錯誤,並停止執行觸發的函式,因此主控台不會有紀錄。
有更能理解存取器的作用嗎?
差不多也到尾聲了,接下來我們要介紹的是物件的凍結、防止擴展和密封方式。
如果對文章有任何疑問,也歡迎在下方提問和建議!
我是 Felix,我們明天再見!