使用Object.keys()可以获取对象本身所有的可遍历属性;
使用Object.getOwnPropertyNames()可以获取对象本身所有属性, 不管是否可遍历;
使用for...in...循环可以获取对象所有可遍历属性, 包括本身的属性和继承的属性;
使用下面的函数可以获取对象的所有属性, 不管是本身还是继承, 不管是可遍历还是不可遍历:
function inheritedPropertyNames(obj) { var props = {}; while(obj) { Object.getOwnPropertyNames(obj).forEach(function(p) { props[p] = true; }); obj = Object.getPrototypeOf(obj); } return Object.getOwnPropertyNames(props); }
这个函数的执行逻辑是: 遍历所有当前对象的属性, 完成后把原型赋值给当前对象, 继续下一轮循环, 直到: Object.getPrototypeOf(Object.prototype.__proto__)为止;