JavaScript對象的屬性是由名字、值和一組特性(可寫、可枚舉、可配置等)構成的。在ECMAScript 5中,屬性值可以用一個或兩個方法代替,這兩個方法就是getter和setter。
var myObj = { a: 2, get b(){ return 3; } }; console.log(myObj.a);//2 console.log(myObj.b);//3
上面的代碼中,屬性a稱為“數據屬性”,它只有一個簡單的值;像屬性b這種用getter和setter方法定義的屬性稱為“存取器屬性”。
存取器屬性定義為一個或兩個與屬性同名的函數,這個函數定義沒有使用function關鍵字,而是使用get或set,也沒有使用冒號將屬性名和函數體分開,但函數體的結束和下一個方法之間有逗號隔開。
當程序查詢存取器的屬性值時,JavaScript代用getter方法(無參數),這個方法的返回值就是該屬性存取表達式的值。當程序設置一個存取器屬性值時,JavaScript調用setter方法,將賦值表達式右側的值當作參數傳入setter。從某種意義上來說,這個方法負責設置屬性值,可以忽略該方法的返回值。
當一個屬性被定義為存取器屬性時,JavaScript會忽略它的value和writable特性,取而代之的是set和get(還有configurable和enumerable)特性。
var myObj = { get a(){ return 2; } }; myObj.a = 3; console.log(myObj.a);//2
如上面代碼所示,由於我們只定義了屬性a的getter,所以對a進行設置(即賦值)時set會忽略賦值操作,不會拋出錯誤。
var myObj = { get a(){ return this._a_; }, set a(val){ this._a_ = val; } }; myObj.a = 3; console.log(myObj.a);//3
正確的寫法如上所示。getter和setter方法中的this都指向myObj對象。這里我們把賦值操作中的3存儲到另一個中間變量 _a_
中。名稱 _a_
只是一種慣例,並沒有其它任何特殊行為,它只是一個普通的屬性。把它換成其它任意合法名稱如 _b_
都行,甚至可以在外面將它打印出來。
var myObj = { get a(){ return this._b_; }, set a(val){ this._b_ = val; } }; myObj.a = 3; console.log(myObj.a);//3 console.log(myObj._b_);//3
另外,存取器屬性也是可以繼承的:
var myObj = { get a(){ return this._b_; }, set a(val){ this._b_ = val; } }; myObj.a = 3; var anotherObj = Object.create(myObj); console.log(anotherObj.a);//3
摘自 https://blog.csdn.net/u012510478/article/details/54312482 博客