JavaScript ES5 对象方法

  • JavaScript ES5对象方法

    ECMAScript 5为JavaScript添加了许多新的对象方法。
    // 添加或更改对象属性
    Object.defineProperty(object, property, descriptor)
    
    // 添加或更改许多对象属性
    Object.defineProperties(object, descriptors)
    
    // 访问属性
    Object.getOwnPropertyDescriptor(object, property)
    
    // 将所有属性作为数组返回
    Object.getOwnPropertyNames(object)
    
    // 将可枚举属性作为数组返回
    Object.keys(object)
    
    // 访问原型
    Object.getPrototypeOf(object)
    
    // 阻止向对象添加属性
    Object.preventExtensions(object)
    // 如果可以将属性添加到对象,则返回true
    Object.isExtensible(object)
    
    // 防止更改对象属性(而不是值)
    Object.seal(object)
    // 如果对象被密封,则返回true
    Object.isSealed(object)
    
    // 防止对对象进行任何更改
    Object.freeze(object)
    // 如果对象被冻结,则返回true
    Object.isFrozen(object)
  • 改变属性值

    语法
    Object.defineProperty(object, property, {value : value})
    此示例更改属性值:
    var person = {
      firstName: "John",
      lastName : "Doe",
      language : "EN" 
    };
    
    // 改变一个属性
    Object.defineProperty(person, "language", {value : "NO"});
    尝试一下
  • 更改元数据

    ES5允许更改以下属性元数据:
    writable : true      // 属性值可以更改
    enumerable : true    // 属性可以枚举
    configurable : true  // 属性可以重新配置
    
    writable : false     // 属性值无法更改
    enumerable : false   // 属性不能枚举
    configurable : false // 属性无法重新配置
    
    ES5允许更改getter和setter:
    // 定义一个 getter
    get: function() { return language }
    // 定义一个 setter
    set: function(value) { language = value }
    此示例language为只读:
    Object.defineProperty(person, "language", {writable:false});
    此示例language不可枚举:
    Object.defineProperty(person, "language", {enumerable:false});
  • 列出所有属性

    此示例列出了对象的所有属性:
    var person = {
      firstName: "John",
      lastName : "Doe"
      language : "EN" 
    };
    
    Object.defineProperty(person, "language", {enumerable:false});
    Object.getOwnPropertyNames(person);  // 返回一个属性数组
    尝试一下
  • 列出可枚举的属性

    此示例仅列出对象的可枚举属性:
    var person = {
      firstName: "John",
      lastName : "Doe"
      language : "EN" 
    };
    
    Object.defineProperty(person, "language", {enumerable:false});
    Object.keys(person);  // 返回可枚举属性的数组
    尝试一下
  • 添加属性

    此示例向对象添加新属性:
    // Create an object:
    var person = {
      firstName: "John",
      lastName : "Doe",
      language : "EN"
    };
    
    // Add a property
    Object.defineProperty(person, "year", {value:"2008"});
    尝试一下
  • 添加Getters和Setter

    Object.defineProperty()方法还可用于添加Getters和Setter:
    //创建一个对象
    var person = {firstName:"John", lastName:"Doe"};
    
    // 定义一个 getter
    Object.defineProperty(person, "fullName", {
      get : function () {return this.firstName + " " + this.lastName;}
    });
    尝试一下
  • 一个反例

    // 定义 对象
    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 (i) {this.counter -= i;}
    });
    
    // Play with the counter:
    obj.reset;
    obj.add = 5;
    obj.subtract = 1;
    obj.increment;
    obj.decrement;
    尝试一下