对于我测试过的x
的大多数值,以下评估为true
:
Object.getPrototypeOf(x) === x.constructor.prototype
...但是有一些例外:如果x
是一个字符串,则上面表达式的LHS会失败,并显示错误,如
TypeError: "abc" is not an object
...虽然,例如,"abc".constructor.prototype
评估为String.prototype
。如果x
是数字或布尔值,则会得到类似的结果。
发生了什么?前面显示的身份是否有更多例外?
更重要的是,上述内容表明x.constructor.prototype
比Object.getPrototypeOf(x)
更强大。
是否有任何理由 完全使用x.constructor.prototype
并完全忘记Object.getPrototypeOf(x)
?
答案 0 :(得分:1)
字符串(以及其他原语)可能表现得有些怪异。
基本上,当您尝试访问基元的属性时,使用其等效的Object以实时方式装箱,然后返回该对象的属性。
因此,在这种情况下,当您尝试访问"abc".constructor
时,实际发生的情况与new String("abc").constructor
相同(当然会返回String
个对象。)
另一方面,Object.getPrototypeOf
没有这样的装箱,而是在你传递任何不是对象的东西时返回错误。
正如你的建议,x.constructor.prototype
确实似乎是一种更可靠的方法来确定某事物的构造函数,因为它确实处理了这种“拳击”案例。也就是说,我个人无法想到任何可能需要这样的东西的真实情况,因为......好吧,通常,你已经知道什么类型的东西了。这与我在大多数时间使用===
时没有看到任何实际意义的原因相同。
答案 1 :(得分:0)
旧版浏览器不支持Object.getPrototypeOf,因为x.constructor.prototype是更多的跨浏览器解决方案。
但是,如果可用,使用Object.getPrototypeOf更可靠,因为x.constructor可以像这样更改:x.constructor ='my new value';
我建议你创建这个polyfill函数:
if (!Object.getPrototypeOf) {
Object.getPrototypeOf = function(o) { return o.__proto__ || o.constructor.prototype; };
}