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",
//  ...
// ]