1. Object.getOwnPropertyNames()
返回一个对象本身所有属性名,不管是否可遍历。
Object.getOwnPropertyNames(Date)
// ["parse", "arguments", "UTC", "caller", "name", "prototype", "now", "length"]
2. Object.keys()
返回一个对象自身可比遍历属性名。
Object.keys(Date) // []
3. Object.prototype.hasOwnProperty()
返回一个布尔值,判断一个属性是否是对象自身属性,下面的例子中Date.length是Date自身的属性,Date.toString是继承的属性。
Date.hasOwnProperty('length') // true
Date.hasOwnProperty('toString') // false
4. in 运算符和 for…in 循环
in运算符返回一个布尔值,表示一个对象是否具有某个属性。它不区分该属性是对象自身的属性,还是继承的属性。
获得对象的所有可遍历属性(不管是自身的还是继承的),可以使用for...in循环。
var o1 = { p1: 123 };
var o2 = Object.create(o1, {
p2: { value: "abc", enumerable: true }
});
for (p in o2) {
console.info(p);
}
// p2
// p1
5. 获得对象的所有属性(不管是自身的还是继承的,也不管是否可枚举)
function inheritedPropertyNames(obj) {
var props = {};
while(obj) {
Object.getOwnPropertyNames(obj).forEach(function(p) {
props[p] = true;
});
obj = Object.getPrototypeOf(obj);
}
return Object.getOwnPropertyNames(props);
}
inheritedPropertyNames(Date)
// [
// "caller",
// "constructor",
// "toString",
// "UTC",
// ...
// ]