JavaScript 从对象检索属性

示例

性能特点:

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

  • 可数

  • 不可数

  • 拥有

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

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

可枚举的目的:

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

检索属性的方法:

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

  1. for..in 循环

    该循环在从对象中检索可枚举的属性时非常有用。另外,此循环将检索可枚举的自身属性,并且将遍历原型链直到将原型视为空,从而执行相同的检索。

    //示例1:简单数据
    var x = { a : 10 , b : 3} , props = [];
    for(prop in x){
     props.push(prop);
    }
    console.log(props); //["a","b"]
    //示例2:原型链中具有无数属性的数据
    var x = { a : 10 , __proto__ : { b : 10 }} , props = [];
    for(prop in x){
     props.push(prop);
    }
    console.log(props); //["a","b"]
    //例3:具有不可枚举属性的数据
    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循环和函数来从对象检索自己的属性。Object.prototype.hasOwnProperty()

    //示例1:简单数据
    var x = { a : 10 , b : 3} , props;
    props = Object.keys(x);
    console.log(props); //["a","b"]
    //示例2:原型链中具有无数属性的数据
    var x = { a : 10 , __proto__ : { b : 10 }} , props;
    props = Object.keys(x);
    console.log(props); //["a"]
    //例3:具有不可枚举属性的数据
    var x = { a : 10 } , props;
    Object.defineProperty(x, "b", {value : 5, enumerable : false});
    props = Object.keys(x);
    console.log(props); //["a"]
  1. Object.getOwnProperties() 功能

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

    //示例1:简单数据
    var x = { a : 10 , b : 3} , props;
    props = Object.getOwnPropertyNames(x);
    console.log(props); //["a","b"]
    //示例2:原型链中具有无数属性的数据
    var x = { a : 10 , __proto__ : { b : 10 }} , props;
    props = Object.getOwnPropertyNames(x);
    console.log(props); //["a"]
    //例3:具有不可枚举属性的数据
    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 }};

//向第一级原型添加不可枚举的属性
Object.defineProperty(x.__proto__, "d", {value : 20, enumerable : false});

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

支持EcmaScript 5的浏览器将支持此功能。