從物件中檢索屬性

特性:

可以從物件檢索的屬性可以具有以下特徵:

  • 列舉
  • 不可數
  • 擁有

在使用 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 的瀏覽器的支援。