![](/img/trans.png)
[英]Can we cast a generic object to a custom object type in javascript?
[英]is there a generic, explicit primitive -> object cast in JavaScript?
我有以下困惑(在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
, String
, Boolean
,...)中选择合适的一种。 这听起来并不困难。
但这确实有点...不对。 感觉更好的是一个内置的/自定义方法cast_as_object
,该方法cast_as_object
语转换为对象,无论其类型是什么,最好以某种通用且面向未来的方式进行。 那可能吗?
(nb当类型名称是唯一的并且基元的集合很小且封闭时,从类型名称转换为原型是微不足道的。但是我问这个问题是希望答案能帮助人们更好地理解理论上简单但实际上复杂的问题兽(即JavaScript的对象模型)。
@Ken Kin —要求提供功能正在问一个问题,不是吗?—不知道您在这里暗示什么。
@charlietfl-我相信我在我的文字中指出了自己的好处,并引用:“我想编写一个类似console.dir的方法来输出对象的所有属性”。 就目前情况而言, console.dir
只会回显原始值的字符串化(一个字)(奇怪的是, new Object( 42 )
产生{}
)。
正如@GameAlchemist提出的,解决方案非常简单:
value = new Object( primitive_value )
您可以将Object.getOwnPropertyNames
和Object.getPrototypeOf
应用于value
,从而可以检索对象和原型链上的所有属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.