一个原本是数据属性的属性,代码里还保存着许多与它相关的代码片段。
现在除了一些变故,我们要改变它。
现在把它变成访问器属性。
假设对象为user,此数据属性为age:
写下user.age是为了得到什么?当然是得到具体的年龄。
可这句话执行时,get函数会站出来说,使用user.age实际上就是在调用我啊,我开始发力了,我要把我的产出作为你这句话的结果。
1 function User(name, birthday) { 2 this.name = name; 3 this.birthday = birthday; 4 5 // 年龄是根据当前日期和生日计算得出的 6 Object.defineProperty(this, "age", { 7 get() { 8 let todayYear = new Date().getFullYear(); 9 return todayYear - this.birthday.getFullYear(); 10 } 11 }); 12 } 13 14 let john = new User("John", new Date(1992, 6, 1)); 15 16 alert( john.birthday ); // birthday 是可访问的 17 alert( john.age ); // ……age 也是可访问的
如此一来,原属性并没有从对象中直接删除,而是改变了属性的类型,从数据属性变为访问器属性。