从对象中检索属性
特性:
可以从对象检索的属性可以具有以下特征:
- 枚举
- 不可数
- 拥有
在使用 Object.defineProperty(ies)
创建属性时,我们可以设置除 own
之外的其特性。直接级别中不在对象的原型级别(__proto__
) 中可用的属性称为自己的属性。
并且在不使用 Object.defindProperty(ies)
的情况下添加到对象中的属性将不具有其可枚举的特性。这意味着它被认为是真实的。
可枚举性的目的:
为属性设置可枚举特性的主要目的是通过使用不同的编程方法,在从对象检索特定属性时使其具有可用性。下面将深入讨论这些不同的方法。
检索属性的方法:
可以通过以下方法检索对象的属性,
-
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"]
-
此函数作为 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"]
-
此函数将从对象检索可枚举和不可枚举的属性。它也作为 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 的浏览器的支持。