我有以下谜题(适用于NodeJS):
console.log((42).toFixed);
console.log(Object.getPrototypeOf(42));
虽然第一行确实显示[Function: toFixed]
,但第二行显示TypeError: Object.getPrototypeOf called on non-object
。我相信,这是规范的正确行为(但令人费解的是,如何相信一切都是JavaScript中的对象)。
现在我想写一个类似console.dir
的方法,它输出一个对象的所有属性,包括那些来自原型的属性,包括那些实际上可以从原始值访问的属性。
当然,问题的关键在于JavaScript试图变得聪明并且做一个幕后操作,将原始价值42
投射到类似new Number( 42 )
的东西上。当您访问原始值上的某个命名属性时,就完成了这个技巧,但是当值是getPrototypeOf
的参数时(我相信它确实应该),则不会。
为了实现我的目标,我可以确定原始值的类型,以防getPrototypeOf
失败,然后从有希望的有限数量的可能性中挑选(Number
,{{ 1}},String
,...)正确的。这甚至听起来都很困难。
但确实感觉有点......错了。更好的是内置/自定义方法Boolean
,它将基元转换为对象,无论其类型是什么,最好是以一些通用和面向未来的方式。这可能吗?
(nb当类型名称是唯一的并且原语集很小且封闭时,从类型名称转到原型是微不足道的 - 但我问这个问题,希望答案能帮助人们更好地理解理论上的简单但实际上错综复杂的野兽是JavaScript的对象模型)。
答案 0 :(得分:0)
@ charlietfl-我相信我在文中说了好处,引用:“我想写一个像console.dir这样输出对象所有属性的方法”。就目前而言,console.dir
将简单地回应原始值的字符串化(简单地说,new Object( 42 )
会产生{}
)。
解决方案结果很简单,正如@GameAlchemist提出的那样:做完之后
value = new Object( primitive_value )
您可以将Object.getOwnPropertyNames
和Object.getPrototypeOf
应用于value
,以便检索对象和原型链上的所有属性。