为何Object.getOwnPropertyNames无法获取Date实例的方法?
问题解答
你遇到的情况是因为Object.getOwnPropertyNames()只会返回对象自身定义的属性,而date1作为Date的实例,它自身并没有任何属性——那些toISOString()之类的方法,其实是存在于Date.prototype(也就是date1的原型)上的,属于原型链继承来的属性,所以不会被Object.getOwnPropertyNames(date1)捕获到。
要获取这些方法,有几种实用方式:
1. 直接获取原型上的所有属性
既然方法都在Date.prototype里,直接对原型调用Object.getOwnPropertyNames()就能拿到所有原型属性(包括不可枚举的):
let date1 = new Date(); // 获取Date原型的所有属性(包括toISOString等方法) Object.getOwnPropertyNames(Date.prototype);
2. 遍历整个原型链获取所有属性
如果想拿到实例自身+原型链上的所有属性(包括不可枚举的),可以写一个遍历原型链的函数:
function getAllProperties(obj) { const props = new Set(); let currentObj = obj; // 遍历原型链直到最顶层的null while (currentObj) { Object.getOwnPropertyNames(currentObj).forEach(prop => props.add(prop)); currentObj = Object.getPrototypeOf(currentObj); } return Array.from(props); } // 使用示例 const date1 = new Date(); console.log(getAllProperties(date1));
3. 获取所有可枚举的属性(包括原型链)
如果只需要可枚举的属性,用for...in循环即可(它会遍历原型链上的可枚举属性):
const date1 = new Date(); for (const prop in date1) { console.log(prop); // 输出所有可枚举属性,包括原型上的方法 }
内容的提问来源于stack exchange,提问作者Teoman shipahi
相关产品推荐
相关产品推荐

