以下代码之间是否有任何区别:
inst instanceof Constr
和
inst.__proto__ === Constr.prototype
例如:
var xyz = {}
xyz instanceof Object
和
xyz.__proto__ === Object.prototype
?如果是这样,有什么区别,哪一个是首选?
答案 0 :(得分:4)
__proto__
不是ECMAScript 5规范的一部分,您无法保证未来的支持。访问对象原型的标准方法是访问构造函数的原型,或者更好的是Object.getPrototypeOf(但这不适用于IE8)。
instanceof检查构造函数的原型,但“测试对象原型链中constructor.prototype的存在。”。
如果您的目标是检查某个对象是否是特定类的实例,并且如果它不是直接实例就可以,那么您应该使用instanceof
运算符:它实际上就是为此而设的
答案 1 :(得分:2)
有两点不同。正如其他人在instanceof
递归之前所提到的那样。您可以按如下方式实现自己的instanceof
版本:
function instanceOf(obj, func) {
return Object.isPrototypeOf.call(func.prototype, obj);
}
此功能取决于Object.prototype.isPrototypeOf
功能的可用性。
第二个区别仅适用于浏览器。正如following answer中所提到的,instanceof
的实际实现如下所示:
function instanceOf(obj, func) {
var prototype = func.prototype;
while (obj = Object.getPrototypeOf(obj)) { //traverse the prototype chain
if (typeof object === "xml") //workaround for XML objects
return prototype === XML.prototype;
if (obj === prototype) return true; //object is instanceof constructor
}
return false; //object is not instanceof constructor
}
这就是全部。有关详细信息,请参阅instanceof
:https://developer.mozilla.org/en/JavaScript/Guide/Details_of_the_Object_Model#Determining_instance_relationships
答案 2 :(得分:1)
进一步检查实例
var GrandParent=function(){};
var Parent = function(){}
Parent.prototype=new GrandParent()
var Child = function(){};
Child.prototype=new Parent()
var c=new Child();
console.log(c instanceof GrandParent);//true
console.log(c.__proto__ === GrandParent);//false
答案 3 :(得分:1)
实际上有第三种方式,看起来很像非标准的__proto__
例子:
Object.getPrototypeOf([]) === Array.prototype
疲倦:
console.log([] instanceof Object);//ture
console.log(Object.getPrototypeOf([]) === Object.prototype);//false
基本上,instanceof
运算符检查整个原型链,其他方法不检查