JavaScript 对象访问器

  • JavaScript对象访问器

    JavaScript访问器(Getter和Setter),ECMAScript 5(2009)介绍了Getter和Setters。 Getters和setter允许您定义对象访问器(Computed Properties)。
  • JavaScript Getter(get关键字)

    此示例使用lang属性和get关键字来获取language属性的值。
    // 新建一个对象:
    var person = {
      firstName: "John",
      lastName : "Doe",
      language : "en",
      get lang() {
        return this.language;
      }
    };
    
    // 使用getter显示对象的数据:
    document.getElementById("demo").innerHTML = person.lang;
    尝试一下
  • JavaScript Setter (set关键字)

    此示例使用lang属性set关键字设置language属性值。
    var person = {
      firstName: "John",
      lastName : "Doe",
      language : "",
      set lang(lang) {
        this.language = lang;
      }
    };
    
    // 使用setter设置对象属性:
    person.lang = "en";
    
    // 显示来自对象的数据:
    document.getElementById("demo").innerHTML = person.language;
    尝试一下
  • 使用JavaScript函数还是Getter?

    这两个例子之间有什么区别?
    var person = {
      firstName: "John",
      lastName : "Doe",
      fullName : function() {
        return this.firstName + " " + this.lastName;
      }
    };
    
    // 使用方法显示对象的数据:
    document.getElementById("demo").innerHTML = person.fullName();
    尝试一下
    var person = {
      firstName: "John",
      lastName : "Doe",
      get fullName() {
        return this.firstName + " " + this.lastName;
      }
    };
    
    // 使用getter显示来自对象的数据:
    document.getElementById("demo").innerHTML = person.fullName;
    尝试一下
    示例1将fullName作为函数访问:person.fullName()。示例2将fullName作为属性访问:person.fullName。第二个示例提供了更简单的语法。
  • 数据质量

    使用getter和setter时,JavaScript可以确保更好的数据质量。lang在此示例中,使用属性language以大写形式返回属性的值:
    // 创建一个对象:
    var person = {
      firstName: "John",
      lastName : "Doe",
      language : "en",
      get lang() {
        return this.language.toUpperCase();
      }
    };
    
    // 使用getter显示来自对象的数据:
    document.getElementById("demo").innerHTML = person.lang;
    尝试一下
    lang在此示例中,使用该属性将大写值存储在language属性中:
    var person = {
      firstName: "John",
      lastName : "Doe",
      language : "",
      set lang(lang) {
        this.language = lang.toUpperCase();
      }
    };
    
    // 使用setter设置对象属性:
    person.lang = "en";
    
    // 显示来自对象的数据:
    document.getElementById("demo").innerHTML = person.language;
    尝试一下
  • 为什么使用Getter和Setter?

    • 它提供了更简单的语法
    • 它允许属性和方法的语法相同
    • 它可以确保更好的数据质量
    • 在幕后做事情很有用
    一个反例
    var obj = {
      counter : 0,
      get reset() {
        this.counter = 0;
      },
      get increment() {
        this.counter++;
      },
      get decrement() {
        this.counter--;
      },
      set add(value) {
        this.counter += value;
      },
      set subtract(value) {
        this.counter -= value;
      }
    };
    
    // Play with the counter:
    obj.reset;
    obj.add = 5;
    obj.subtract = 1;
    obj.increment;
    obj.decrement;
    尝试一下
  • Object.defineProperty()

    Object.defineProperty()方法还可用于添加Getters和Setter:
    // 定义对象
    var obj = {counter : 0};
    
    // 定义 setters
    Object.defineProperty(obj, "reset", {
      get : function () {this.counter = 0;}
    });
    Object.defineProperty(obj, "increment", {
      get : function () {this.counter++;}
    });
    Object.defineProperty(obj, "decrement", {
      get : function () {this.counter--;}
    });
    Object.defineProperty(obj, "add", {
      set : function (value) {this.counter += value;}
    });
    Object.defineProperty(obj, "subtract", {
      set : function (value) {this.counter -= value;}
    });
    
    // Play with the counter:
    obj.reset;
    obj.add = 5;
    obj.subtract = 1;
    obj.increment;
    obj.decrement;
    尝试一下
  • 浏览器支持

    Internet Explorer 8或更早版本不支持Getters和Setter:
    Internet Explorer Chrome FireFox Safari Opera
    9.0+
    支持
    支持
    支持
    支持