可以查找到的资料都说"Javascript 的 instanceof 操作符可以用来比较两个操作数的构造函数 constructor"。例如:细说JavaScript(三)
我在实际中却被搞糊涂了,请看如下代码:
function O2(aa,bb){
var aa = aa;
this.bb = bb;
}
//1、正常情况
var o2 = new O2("a2","b2");
console.log(o2 instanceof O2);//true
//2、修改了构造函数的原型对象
var o4 = new O2("a4","b4");
O2.prototype = {};
console.log(o4 instanceof O2);//false
//3、修改了构造函数原型对象的constructor属性
var o6 = new O2("a6","b6");
O2.prototype.constructor = Object;
console.log(o6 instanceof O2);//true
问题来了:为什么2中可以导致false,而3中修改了构造函数原型对象的constructor属性却还是可以判断为true呢?说好的以constructor为依据呢?
新问题来了:
我在o4处已经改了O2.prototype = {};所以o4返回了false
为什么var o6 = new O2("a6","b6");之后,o6又成了true呢?
原型被o4处修改之后,原型对象不就永久改变了么?
依据就是原型链
prototype
!o2 instanceof O2
意思是说o2.__proto__
能不能在O2
的原型链上找得到.第二个中本来
o2.__proto__ === O2.prototype
, 但是你后面把O2.prototype
改了, 所以就不等了, 结果自然是false
;第三个你只是改了
O2.prototype
中的一个属性, 没改变O2.prototype
的指向, 所以返回true
,