|
有两种类型的对象属性。
第一种是 数据属性。我们已经知道如何使用它们了。到目前为止,我们使用过的所有属性都是数据属性。
第二种类型的属性是新东西。它是 访问器属性(accessor property)。它们本质上是用于获取和设置值的函数,但从外部代码来看就像常规属性。
getter 和 setter
访问器属性由 “getter” 和 “setter” 方法表示。在对象字面量中,它们用 get 和 set 表示:
let obj = {
get propName() {
// 当读取 obj.propName 时,getter 起作用
},
set propName(value) {
// 当执行 obj.propName = value 操作时,setter 起作用
}
};
当读取 obj.propName 时,getter 起作用,当 obj.propName 被赋值时,setter 起作用。
例如,我们有一个具有 name 和 surname 属性的对象 user:
let user = {
name: "John",
surname: "Smith"
};
现在我们想添加一个 fullName 属性,该属性值应该为 "John Smith"。当然,我们不想复制粘贴已有的信息,因此我们可以使用访问器来实现:
let user = {
name: "John",
surname: "Smith",
get fullName() {
return `${this.name} ${this.surname}`;
}
};
alert(user.fullName); // John Smith
从外表看,访问器属性看起来就像一个普通属性。这就是访问器属性的设计思想。我们不以函数的方式 调用 user.fullName,我们正常 读取 它:getter 在幕后运行。
截至目前,fullName 只有一个 getter。如果我们尝试赋值操作 user.fullName=,将会出现错误:
let user = {
get fullName() {
return `...`;
}
};
user.fullName = "Test"; // Error(属性只有一个 getter)
让我们通过为 user.fullName 添加一个 setter 来修复它:
let user = {
name: "John",
surname: "Smith",
get fullName() {
return `${this.name} ${this.surname}`;
},
set fullName(value) {
[this.name, this.surname] = value.split(" ");
}
};
// set fullName 将以给定值执行
user.fullName = "Alice Cooper";
alert(user.name); // Alice
alert(user.surname); // Cooper
现在,我们就有一个“虚拟”属性。它是可读且可写的。
|
|