iT邦幫忙

2022 iThome 鐵人賽

DAY 14
0
自我挑戰組

JavaScript亂記系列 第 14

Getter 與 Setter,賦值運算不使用函式

  • 分享至 

  • xImage
  •  
  • Setter:存值的方法
  • Getter:取得特定值的方法(不會傳入參數)

Setter

答:250

var wallet = {
    total: 100,
    //set就是
    set save(price) {
        this.total = this.total + price / 2;
    }
}
wallet.save = 300; //並不是用函示,而是直接賦值
console.log(wallet.save);

Getter

答:125

var wallet = {
    total: 100,
    //set就是
    set save(price) {
        this.total = this.total + price / 2;
    },
    get save(){
        //因Getter是取值所以要用return
        return this.total / 2; 
    }
}
wallet.save = 300; //並不是用函示,而是直接賦值
console.log(wallet.save);

Getter注意
藍色:尚未點擊時
黃色:(...)點下去才執行取值Set

使用Object.defineProperty

Object.defineProperty(wallet, 'save', {
    configurable: true,
    enumerable: true,
    set: function (price) {
        this.total = this.total + price / 2;
    },
    get: function () {
        return this.total / 2;
    }
});
wallet.save = 300;
console.log(wallet);
console.log(Object.getOwnPropertyDescriptor(wallet, "save"));

補充

Object.defineProperty

屬性描述器

當對於屬性除了指定key/value以外有更進一步的要求時
例如設定屬性為read-only甚至是constant時,就可以使用屬性描述器
就算沒有屬性描述器,我們依然可以撰寫JavaScript
但使用屬性描述器可以讓我們的程式更為強健

#屬性的特徵
也就是 屬性的設定

特徵的種類

實際上,屬性特徵有以下六種:

  • Writable : 屬性是否可改值
  • Configurable : 是否可改變該屬性的特徵/刪除該屬性
  • Enumerable : 屬性是否可列舉
  • Value : 屬性的值
  • Get :
  • Set :

一般在使用屬性字面值宣告屬性的時候:

writable、configurable、enumerable 都會為 true
value 就代表屬性的值
get、set 則是沒有設定。

例 抓陣列中的值

答:3

var a = [1, 2, 3];
Object.defineProperty(Array.prototype,'latest',{
    get: function () {
        return this[this.length - 1];
    }
})
console.log(a.latest);

上一篇
function函式
下一篇
運算子 & 真假值
系列文
JavaScript亂記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言