Object.getPrototypeOf(x)和x.constructor.prototype之间的区别
Difference between Object.getPrototypeOf(x) and x.constructor.prototype?
对于我测试过的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)
吗?
字符串(和其他基元)的行为可能有点奇怪。
基本上,当您尝试访问基元的属性时,它会使用其Object等价物以即时方式装箱,然后返回该对象的属性。
因此,在这种情况下,当您尝试访问"abc".constructor
时,实际发生的情况与new String("abc").constructor
(当然会返回String
对象)相同。
另一方面,Object.getPrototypeOf
不进行这种装箱,而是在传递任何非对象的信息时返回错误。
正如您所建议的,x.constructor.prototype
似乎是一种更可靠的确定某个东西的构造函数的方法,因为它确实处理了这种"装箱"情况。也就是说,就我个人而言,我想不出任何真正的情况下可能需要这样的东西,因为。。。嗯,通常情况下,你已经知道什么是类型的东西了。这也是我认为大多数时候使用===
没有任何实际意义的原因。
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; };
}
- Date.prototype.newFunction 和 Date.newFunction 之间的区别
- object.key = fn() 与 object.prototype.key = fn() 之间的差异
- JavaScript 和 prototype 之间的区别
- JavaScript 中 Function.prototype 和 Object.prototype 之间的区别
- Prototype 和 jQuery 之间的冲突
- Firefox 和 chrome 在 constructor.prototype 之间的行为差异
- JavaScript:继承时this.watever和prototype.whatever之间的区别
- Object.getPrototypeOf(x)和x.constructor.prototype之间的区别
- jQuery、BootStrap和Prototype之间的别名
- javascript.prototype.abc和javascript.prottype之间的区别
- Function和Function.prototype之间的区别
- 是否可以在不发生冲突的情况下修复prototype.js和jquery.js之间的冲突
- Javascript-在不使用Array.prototype.filter的情况下,根据键值获取两个对象数组之间的差异
- 如何解决Prototype与DataPicker或Tooltip之间的jQuery冲突
- Something.prototype.else和Something.else之间有什么区别
- Javascript -这两者之间有区别吗?Foo和this.prototype.foo
- _.extend(Something)和_.extend(Something)之间的区别是什么?prototype, s
- 什么'prototype[name]和prototype.name之间有什么区别
- obj.prototype和Object.getPrototypeOf(obj)之间有什么区别
- prototype.constructor和内置Object()之间有什么区别