new和instanceof的内部机制

首先我们来看看var obj = new O()这条语句发生了什么:

var obj = (function(){
    var obj = {};
    obj.__proto__ = O.prototype;

    //其他赋值语句...

    return obj;
})();

也就是说var obj = new O()返回了一个obj对象,它的隐式原型链(__proto__)是指向O原型(prototype)的。这就是new的内部工作方式。

下面再看instanceof,假设现在有 x instanceof y 一条语句,则其内部实际作出了如下的判断:

while(x.__proto__!==null) {
  if(x.__proto__===y.prototype) {
    return true;
    break;
  }
  x.__proto__
= x.__proto__.proto__; }
if(x.__proto__==null) {return false;}

x会一直沿着隐式原型链__proto__向上查找直到x.__proto__.__proto__......===y.prototype为止,如果找到则返回true,也就是x为y的一个实例。否则返回false,x不是y的实例。

下面举出两个例子,把对O的原型(prototype)的修改放在obj的声明之前和之后的两种情况下,使用instanceof对obj作检测的结果对比:

 1 function F(){}
 2 function O(){}
 3 
 4 O.prototype = new F();
 5 var obj = new O();
 6 /*
    以上两条语句等同于如下代码
    var obj = (function(){
      var obj1 = {};
      var obj2 = {};
      obj2.__proto__ = F.prototype;
      obj.__proto__ = obj2;
      return obj;
    })()
  */ 7 console.log(obj instanceof O);//true 8 console.log(obj instanceof F);//true 9 console.log(obj.__proto__===O.prototype);//true 10 console.log(obj.__proto__.__proto__===F.prototype);//true

上面这个例子中obj.__proto__和o.prototype都是指向new F()这个对象的,所以obj instanceof o结果为true;

假设上面new F()这个对象为objF,则根据new的内部机制,objF.__proto__===F.prototype,而objF.__proto__等于obj.__proto__.__proto__。

所以obj instanceof F结果也是true。

 1 function F(){}
 2 function O(){}
 3 
 4 var obj = new O();
 5 o.prototype = new F();
 6 
 7 console.log(obj instanceof O);//false
 8 console.log(obj instanceof F);//false
 9 console.log(obj.__proto__===O.prototype);//false
10 console.log(obj.__proto__.__proto__===F.prototype);//false

也假设上面new F()这个对象为objF。

这个例子中obj.prototype的修改在obj的声明之后,也就是说obj.__proto__是指向o最初始的prototype,自然地obj.__proto__也与objF不相等。所以obj instanceof O结果为false。

最后,obj instance F为false也很好理解,这是因为obj.__proto__.__proto__指向的是Object.prototype。

转载于:https://www.cnblogs.com/WhiteCusp/p/3171705.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值