LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 288|回复: 0

属性的 getter 和 setter

[复制链接]
发表于 2024-1-15 16:54:12 | 显示全部楼层 |阅读模式
有两种类型的对象属性。

第一种是 数据属性。我们已经知道如何使用它们了。到目前为止,我们使用过的所有属性都是数据属性。

第二种类型的属性是新东西。它是 访问器属性(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
现在,我们就有一个“虚拟”属性。它是可读且可写的。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表