從物件中檢索屬性
特性:
可以從物件檢索的屬性可以具有以下特徵:
- 列舉
- 不可數
- 擁有
在使用 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 的瀏覽器的支援。