从对象中检索属性

特性:

可以从对象检索的属性可以具有以下特征:

  • 枚举
  • 不可数
  • 拥有

在使用 Object.defineProperty(ies) 创建属性时,我们可以设置除 own 之外的其特性。直接级别中不在对象的原型级别(__proto__) 中可用属性称为自己的属性。

并且在不使用 Object.defindProperty(ies) 的情况下添加到对象中的属性将不具有其可枚举的特性。这意味着它被认为是真实的。

可枚举性的目的:

为属性设置可枚举特性的主要目的是通过使用不同的编程方法,在从对象检索特定属性时使其具有可用性。下面将深入讨论这些不同的方法。

检索属性的方法:

可以通过以下方法检索对象的属性,

  1. for..in 循环

    此循环在从对象检索可枚举属性时非常有用。此外,这个循环将检索可枚举的自有属性,并且它将通过遍历原型链进行相同的检索,直到它将原型视为 null。

    //Ex 1 : Simple data
    var x = { a : 10 , b : 3} , props = [];
    
    for(prop in x){
      props.push(prop);
    }
    
    console.log(props); //["a","b"]
    
    //Ex 2 : Data with enumerable properties in prototype chain
    var x = { a : 10 , __proto__ : { b : 10 }} , props = [];
    
    for(prop in x){
      props.push(prop);
    }
    
    console.log(props); //["a","b"]
    
    //Ex 3 : Data with non enumerable properties
    var x = { a : 10 } , props = [];
    Object.defineProperty(x, "b", {value : 5, enumerable : false});
    
    for(prop in x){
      props.push(prop);
    }
    
    console.log(props); //["a"]
    
  2. Object.keys() 功能

    此函数作为 EcmaScript 5 的一部分公布。它用于从对象检索可枚举的自有属性。在发布之前,人们习惯通过结合 for..in loop 和 Object.prototype.hasOwnProperty() 函数从对象中检索自己的属性。

    //Ex 1 : Simple data
    var x = { a : 10 , b : 3} , props;
    
    props = Object.keys(x);
    
    console.log(props); //["a","b"]
    
    //Ex 2 : Data with enumerable properties in prototype chain
    var x = { a : 10 , __proto__ : { b : 10 }} , props;
    
    props = Object.keys(x);
    
    console.log(props); //["a"]
    
    //Ex 3 : Data with non enumerable properties
    var x = { a : 10 } , props;
    Object.defineProperty(x, "b", {value : 5, enumerable : false});
    
    props = Object.keys(x);
    
    console.log(props); //["a"]
    
  3. Object.getOwnProperties() 功能

    此函数将从对象检索可枚举和不可枚举的属性。它也作为 EcmaScript 5 的一部分发布。

    //Ex 1 : Simple data
    var x = { a : 10 , b : 3} , props;
    
    props = Object.getOwnPropertyNames(x);
    
    console.log(props); //["a","b"]
    
    //Ex 2 : Data with enumerable properties in prototype chain
    var x = { a : 10 , __proto__ : { b : 10 }} , props;
    
    props = Object.getOwnPropertyNames(x);
    
    console.log(props); //["a"]
    
    //Ex 3 : Data with non enumerable properties
    var x = { a : 10 } , props;
    Object.defineProperty(x, "b", {value : 5, enumerable : false});
    
    props = Object.getOwnPropertyNames(x);
    
    console.log(props); //["a", "b"]
    

杂项:

下面给出了一种从对象中检索所有(自己的,可枚举的,不可枚举的,所有原型级别)属性的技术,

function getAllProperties(obj, props = []){
  return obj == null ? props :
           getAllProperties(Object.getPrototypeOf(obj),
               props.concat(Object.getOwnPropertyNames(obj)));
}

var x = {a:10, __proto__ : { b : 5, c : 15 }};

//adding a non enumerable property to first level prototype
Object.defineProperty(x.__proto__, "d", {value : 20, enumerable : false});

console.log(getAllProperties(x)); ["a", "b", "c", "d", "...other default core props..."]

这将得到支持 EcmaScript 5 的浏览器的支持。