• 如何判断对象中是否包含一个属性
    var Person = {
        name : 'wenzhe',
        number : 91
    };
    
    // checks for both own properties and prototype properties
    console.log('number' in Person);  // true
    console.log('constructor' in Person);  // true
    
    //  only checks for own properties
    console.log(Person.hasOwnProperty('number'));  // true
    console.log(Person.hasOwnProperty('constructor'));  // false
  • 删除对象中一个属性
    var Person = {
        name : 'wenzhe',
        number : 91
    };
    
    delete Person.name;
    console.log('name' in Person) // false 
  • 列举对象中的属性和值
    var Person = {
        name : 'wenzhe',
        number : '00'
    };
    
    for (pro in Person) {
        console.log(pro + ' : ' + Person[pro]);
    }
    
    // name : wenzhe
    // number : 00
    // 此方法可以枚举自己和原型链中的内容
    
    
    
    // 还可以使用对象的keys方法,它返回一个数组,里面的内容就是由所有
    // 的对象的key值构成的数组, 但是不会包含原型链中的内容
    
    var properties = Object.keys(Person);
    var i = 0, len = properties.length;
    for (var i = 0, len = properties.length; i < len; i++) {
        console.log(properties[i] + ' : ' + Person[properties[i]]);
    } 
    
    
  • 枚举
    如果某个属性的的设定为不可枚举的,那么上面那两种方法都不能显示出那个属性,但是对于keys返回的那个数组,仍然包含不可被枚举的那个值

        //  properties是数组,每个数组都有自己的length属性
        console.log('length' in properties) // true;
        console.log(Person.propertyIsEnumerable('length'));  // false
    
  • Get & Set(accessor properties)

    var Person2 = {
        name : 'wenze';
        
        get name() {
            console.log('Reading name');
            return this.name;
        }
        
        set name(value) {
            console.log('Setting name');
            this.name = value;
        }
    }
    
    Person2.name = "Chen";
  • 在对象外面为对象添加属性的方法

    • 在对象外面添加一般的属性(Data Property)--Object.defineProperty

      var person = {};
      Object.defineProperty(person, "name", {
          value : 'wz', // 该属性的值
          enumerable : true, // 是否可以被枚举
          configurable : true,  //name可以由Data pro <-> accessor property
          writable : false //  不能在被更改,同类型也不行
          })
      
    • 在对象外面添加 get&set

      var person1 = {name : 1};
      Object.defineProperty(person1, "name", {
          get: function() {
              console.log("Reading name");
              return this._name;
          },
          set: function(value) {
              console.log("Setting name to %s", value);
              this._name = value;
          },
          enumerable: true,
          configurable: true
      })
    • 添加多个属性使用Object.defineProperty

      var person1 = {};
      Object.defineProperties(person1, {
         _name: {
             value: "Nicholas",
             enumerable: true,
             configurable: true,
             writable: true
          },
          name: {
                 get: function() {
                     console.log("Reading name");
                     return this._name;
                 },
                 set: function(value) {
                     console.log("Setting name to %s", value);
                     this._name = value;
                 },
                 enumerable: true,
                 configurable: true
         }
      });
  • 查看属性值的设置情况

    var person1 = {
        name: "WZ"
    };
    var descriptor = Object.getOwnPropertyDescriptor(person1,       "name");
     
    console.log(descriptor.enumerable);
    console.log(descriptor.configurable);
    console.log(descriptor.writable);
    console.log(descriptor.value);
    // true
    // true
      // true
      // "WZ"

Mystery_Wen
12 声望1 粉丝