getter 和 setter

gettersetter 允許你定義用於在類上讀取和寫入給定屬性的自定義行為。對於使用者,它們看起來與任何典型屬性相同。但是,在內部,你提供的自定義函式用於確定訪問屬性時的值(getter),並在分配屬性(setter)時執行任何必要的更改。

class 定義中,getter 的編寫方式類似於以 get 關鍵字為字首的無引數方法。setter 類似,只是它接受一個引數(分配了新值),而使用了 set 關鍵字。

這是一個示例類,它為 .name 屬性提供了一個 getter 和 setter。每次分配時,我們都會在內部 .names_ 陣列中記錄新名稱。每次訪問時,我們都會返回最新的名稱。

class MyClass {
    constructor() {
        this.names_ = [];
    }

    set name(value) {
        this.names_.push(value);
    }

    get name() {
        return this.names_[this.names_.length - 1];
    }
}

const myClassInstance = new MyClass();
myClassInstance.name = 'Joe';
myClassInstance.name = 'Bob';

console.log(myClassInstance.name); // logs: "Bob"
console.log(myClassInstance.names_); // logs: ["Joe", "Bob"]

如果你只定義了一個 setter,那麼嘗試訪問該屬性將始終返回 undefined

const classInstance = new class {
    set prop(value) {
        console.log('setting', value);
    }
};

classInstance.prop = 10; // logs: "setting", 10

console.log(classInstance.prop); // logs: undefined

如果你只定義了一個 getter,則嘗試分配該屬性將不起作用。

const classInstance = new class {
    get prop() {
        return 5;
    }
};

classInstance.prop = 10;

console.log(classInstance.prop); // logs: 5