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