概述
- get和set為對象創(chuàng)造了一個偽屬性的定義
- get方法返回一個值酒奶,set方法為一個屬性賦值
get語法
{ get prop () {} } //prop是要綁定到給定函數(shù)的屬性名
{ get [expression] () {} }
/*
*expression是一個計算屬性名的表達式
*例如:var expresstion = 'a';
* var b = { [expression]: 'c' };
*/
- 例子:
在新對象初始化時定義一個getter
這會給對象obj定義一個偽屬性add灶似,他會返回數(shù)組中最后一個元素
var obj = {
a: ['a', 'b', 'c'],
get add () {
if(this.a.length == 0) return undefined;
return this.a[this.a.length - 1];
}
}
console.log(obj.add); //expect output : c
注意,get定義的偽屬性無法被賦值
描述
有時需要允許訪問返回動態(tài)計算值的屬性终吼,或者你可能需要反映內(nèi)部變量的狀態(tài),而不需要使用顯式方法調(diào)用氯哮。在JavaScript中际跪,可以使用 getter 來實現(xiàn)。雖然可以使用 getter 和 setter 來創(chuàng)建一個偽屬性類型喉钢,但是不可能同時將一個 getter 綁定到一個屬性并且該屬性實際上具有一個值姆打。
使用get語法時注意:
1.它的標識符可以是數(shù)字或字符串;
2.它必須有一個明確的參數(shù)肠虽;
3.在對象字面量中幔戏,不能為一個已有真實值的變量使用 ,也不能為一個屬性設(shè)置多個 get
{get x(v) {}, get x(v) {}}
和{get x(v) {}, x: 'a'}
是不允許的
一種額外的優(yōu)化方案
一種額外的優(yōu)化技術(shù)是用智能或記憶化 getters 延遲屬性值的計算并將其緩存以備以后訪問税课。該值是在第一次調(diào)用getter 時計算的闲延,然后被緩存,因此后續(xù)訪問返回緩存值而不重新計算它韩玩。這在以下情況下很有用:
- 如果屬性值的計算是昂貴的(占用大量RAM或CPU時間垒玲,產(chǎn)生工作線程,檢索遠程文件等)找颓。
- 如果現(xiàn)在不需要該值合愈。它將在稍后使用,或在某些情況下它根本不使用。
- 如果被使用佛析,它將被訪問幾次益老,并且不需要重新計算該值將永遠不會被改變,或者不應(yīng)該被重新計算寸莫。
例如:
get notifier () {
delete this.notifier;
return this.notifier = document.getElementById('none');
}
上面的例子表明當調(diào)用obj.notifier時捺萌,先刪掉這個偽屬性,然后重新給這個屬性賦一個顯性的值储狭,并返回這個值互婿,再以后調(diào)用這個屬性就不會有g(shù)et方法,屬于一種getter的懶調(diào)用辽狈,只計算一次慈参。
set語法
set prop (val) {
this.xxx.push (val);
}
set [expression] (val) {
this.xxx.push (val);
}
- prop是屬性名,val是傳進來的值刮萌,必寫驮配,expression是計算屬性名
例子
var obj = {
set current (val) {
this.log.push(val);
},
log: []
}
obj.current = 'a'; //obj.log = ['a']
obj.current = 'b'; //obj.log = ['a', 'b']
注意:current屬性是未定義的,被訪問時會返回undefined
描述
在 javascript 中着茸,如果試著改變一個屬性的值壮锻,那么對應(yīng)的 setter 將被執(zhí)行。setter 經(jīng)常和 getter 連用以創(chuàng)建一個偽屬性涮阔。不可能在具有真實值的屬性上同時擁有一個 setter 器猜绣。
使用setter語法時注意:
1.它的標識符可以是數(shù)字或字符串;
2.它必須有一個明確的參數(shù)敬特;
3.在對象字面量中掰邢,不能為一個已有真實值的變量使用 set ,也不能為一個屬性設(shè)置多個 set
{set x(v) {}, set x(v) {}}
和{set x(v) {}, x: 'a'}
是不允許的