get propertyName(){} 用來得到當(dāng)前屬性值得回調(diào)函數(shù)
set propertyName(){} 用來監(jiān)視當(dāng)前屬性值變化的回調(diào)函數(shù)
存諸器屬性和數(shù)據(jù)屬性:
var num= {
a: 2,
get b(){
return 2;
}
};
console.log(num.a);//2
console.log(num.b);//2
上面的代碼中,屬性a稱為“數(shù)據(jù)屬性”,它只有一個(gè)簡單的值;像屬性b這種用getter和setter方法定義的屬性稱為“存取器屬性”。
存取器屬性定義為一個(gè)或兩個(gè)與屬性同名的函數(shù),這個(gè)函數(shù)定義沒有使用function關(guān)鍵字,而是使用get或set,也沒有使用冒號(hào)將屬性名和函數(shù)體分開,但函數(shù)體的結(jié)束和下一個(gè)方法之間有逗號(hào)隔開。
當(dāng)程序查詢存取器的屬性值時(shí),JavaScript代用getter方法(無參數(shù)),這個(gè)方法的返回值就是該屬性存取表達(dá)式的值。當(dāng)程序設(shè)置一個(gè)存取器屬性值時(shí),JavaScript調(diào)用setter方法,將賦值表達(dá)式右側(cè)的值當(dāng)作參數(shù)傳入setter。從某種意義上來說,這個(gè)方法負(fù)責(zé)設(shè)置屬性值,可以忽略該方法的返回值。
當(dāng)一個(gè)屬性被定義為存取器屬性時(shí),JavaScript會(huì)忽略它的value和writable特性,取而代之的是set和get(還有configurable和enumerable)特性。
對象本身的兩個(gè)方法
1. es5
- 原型屬性寫法
function Num(n){
this._num = n;
}
Num.prototype = {
get num() {
console.log('get');
return this._num;
},
set num(n) {
console.log(n,"set")
this._num = n;
}
}
let nu = new Num(3);
console.log(nu.num,"============")//get
nu.num = 34 //34 set
console.log(nu.num,"------------") //get
- 對象屬性寫法
function Num(n){
let me = this;
me._num = n;
return {
get num(){
console.log("get")
return me._num;
},
set num(n) {
console.log("set",n);
me._num = n;
}
}
}
let nu = new Num(3);
console.log(nu.num,"============")//get
nu.num = 34 //34 set
console.log(nu.num,"------------") //get
2. es6寫法
class Num {
constructor(n) {
this._num = n;
}
get num() {
console.log("get")
return this._num;
}
set num(n) {
console.log("set",n)
this._num = n;
}
}
let nu = new Num(3);
nu.num = 6 //set 6
// console.log(nu.num,"============") //get 6 =============
nu.num = 34 //set 34
console.log(nu.num,"------------") //get 34 =============