4

对于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)?

4

2 回答 2

1

字符串(和其他原语)的行为可能有点奇怪。

基本上,当您尝试访问基元的属性时,它会使用其等效对象以即时方式装箱,然后返回该对象的属性。

因此,在这种情况下,当您尝试访问时"abc".constructor,实际发生的情况与new String("abc").constructor(当然返回String对象)相同。

另一方面,Object.getPrototypeOf没有这样的装箱,如果你传递任何不是对象的东西,而是返回一个错误。

正如您所建议的,x.constructor.prototype似乎确实是确定某物的构造函数的更可靠方法,因为它确实处理了这种“装箱”情况。也就是说,我个人想不出任何可能需要这样的东西的实际情况,因为......好吧,通常,你已经知道某物是什么类型。===这也是我在大多数时间里看不到任何真正意义的原因。

于 2013-09-02T22:42:58.810 回答
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; };
}
于 2013-09-02T22:45:51.937 回答