對象訪問器就是setter和getter,他們的作用就是
-
- 提供另外一種方法來獲取或者設置對象的屬性值,
- 並且在獲取和設置的時候,可以用一定的其他操作。
看下面代碼:
<script> var person = { _name : "abc", //注意此處的_name有一個下划線 }; Object.defineProperty(person,"name",{ //注意第二個參數的前面沒有下划線,所以_name和name是兩個不同的屬性 set : function(value){ this._name = "new name " + value; //注意這里是給_name屬性賦值 }, get : function(){ return "this is name get by function : " + this._name; //注意這里是返回字符串加上_name的值 } }); //到這里,person於是就有了兩個屬性:_name和name屬性 // 直接獲取_name屬性 console.log(person._name); //abc //通過name屬性來間接獲取_name的值,因為會執行name屬性的getter訪問器屬性(方法) console.log(person.name); //this is name get by function : abc // 直接修改_name屬性 person._name = "xyz"; console.log(person._name); //xyz //修改name屬性,但是name屬性的setter訪問器屬性(方法),會作用到_name屬性上 person.name = "wtf"; //該字符串會在前面加上new name,然后在賦值給_name console.log(person._name); //new name wtf console.log(person.name); //this is name get by function : new name wtf </script>
看完代碼,你可能覺得setter和getter有點多余,直接使用原來的變量就能實現,為何要多此一舉?
其實有些情況setter和getter很使用,比如在設置屬性的時候需要將屬性值做一些處理,當然這些處理可以在外部定義函數實現,也可以直接處理之后賦值,但是,使用setter和getter更加符合編程的思維,賦值或者獲取屬性值是不需要進行額外的操作,因為操作已經封裝了,並且對外部來說是透明的。