使用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__)為止;