参看 MDN 文档和一篇文章
- getter :→ https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/get
- setter: → https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/set
- 一篇文章:→ 属性的 getter 和 setter
- get 语法将对象属性绑定到查询该属性时将被调用的函数
- 当尝试设置属性时,set 语法将对象属性绑定到要调用的函数
getter 和 setter 实际上是一种调用属性的一种方法,本质上其实是一种函数,因为调用它们的方式和使用属性的方式一模一样,所以也叫做属性,是一种访问器属性。
const user = {firstName: "Eddie",lastName: "Ma",get fullName() {return this.firstName + " " + this.lastName;}};console.log(user.fullName);// Eddie Ma
fullName 就像一个属性一样直接能够访问,它的属性值是计算出来的,当访问 user.fullName 的使用,自动调用了 getter 方法
这种属性是伪属性,能够直接访问,向如下这样直接修改会报错 user.fullName = "Eddie Peng"
const user = {firstName: "Eddie",lastName: "Ma",get fullName() {return this.firstName + " " + this.lastName;}};user.fullName = "Eddie Peng";console.log(user.fullName);// Uncaught TypeError: Cannot set property fullName of #<Object> which has only a getter
报错的道理很简单,伪属性的本质上是一个函数,是计算出来的,当然不能直接修改,修改方式自然还是通过函数的方式修改,我们使用 setter
const user = {firstName: "Eddie",lastName: "Ma",get fullName() {return this.firstName + " " + this.lastName;},set fullName(name) {const array = name.split(" ");if (array.length === 2) {this.firstName = array[0];this.lastName = array[1];}}};user.fullName = "Eddie Peng";console.log(user.fullName);// Eddie Peng
现在使用 user.fullName = "Eddie Peng" 不会报错了,因为它会自动调用 setter 方法做计算
我们发现一个道理,getter 和 setter 本质上都是依赖现有的实属性的,它的设计初衷就是这样
以下方式可以在一个现有对象上添加一个伪属性
const user = {firstName: "Eddie",lastName: "Ma"};Object.defineProperty(user, "fullName", {get() {return this.firstName + " " + this.lastName;},set(name) {const array = name.split(" ")if(array.length ===2){this.firstName = array[0]this.lastName = array[1]}}});console.log(user.fullName)// Eddie Mauser.fullName = "Eddie Peng"console.log(user.fullName)// Eddie Peng
「@浪里淘沙的小法师」
