get 用以定义获取时执行的函数,会有一个返回值
set 用以定义设置时执行的函数

作用:

  • 用来代替内部属性被外部访问

  • 用以设置一个计算属性的值

  • 用来监听某个值的变化而改变其他属性值

1. 基本用法

通过 get 和 set 定义一个属性,代替内部属性被外部访问

  1. var o = {
  2. _age:18,
  3. get age(){
  4. return this._age;
  5. },
  6. set age(val) {
  7. this._age = val;
  8. }
  9. }
  10. o.age //=> 18
  11. o.age = 23
  12. o.age //=> 23
  13. o._age //=> 23

下划线开头的属性表示对象内部的属性,一般不直接在外面访问,而是通过对象内的方法访问。

在 get 中返回其他属性的计算结果,来定义一个计算属性

  1. var user = {
  2. firstName: '三',
  3. lastName: '张',
  4. get fullName(){
  5. return this.lastName + this.firstName;
  6. }
  7. }
  8. user.fullName //=> '张三'

通过在 set 中执行相应的操作,来监听某个值的变化从而改变其他属性值

  1. var o = {
  2. _year: 2018
  3. age:18,
  4. get year(){
  5. return this._year;
  6. },
  7. set year(val) {
  8. this._year= val;
  9. this.age = val - 2018 + this.age;
  10. }
  11. }
  12. o.age //=> 18
  13. o.year = 2019
  14. o.age //=> 19

2. Object.defineProperty

可以通过 Object.defineProperty 来定义对象属性的 set 和 get 函数

  1. var book = {
  2. _year: 2004,
  3. edition: 1
  4. };
  5. Object.defineProperty(book, "year", {
  6. get: function(){
  7. return this._year;
  8. },
  9. set: function() {
  10. if(newValue > 2004) {
  11. this._year = newValue;
  12. this.edition += newValue - 2004;
  13. }
  14. }
  15. });
  16. book.year = 2005;
  17. alert(book.edition); //2

这个方法同样可以定义其初始值,并且设置其属性的内部数据属性。这样设置的 get/set 也会像前面那种方法一样在对象中呈现出来