new和instanceof的内部机制
2013-07-04 15:37
253 查看
首先我们来看看var obj = new O()这条语句发生了什么:
也就是说var obj = new O()返回了一个obj对象,它的隐式原型链(__proto__)是指向O原型(prototype)的。这就是new的内部工作方式。
下面再看instanceof,假设现在有 x instanceof y 一条语句,则其内部实际作出了如下的判断:
x会一直沿着隐式原型链__proto__向上查找直到x.__proto__.__proto__......===y.prototype为止,如果找到则返回true,也就是x为y的一个实例。否则返回false,x不是y的实例。
下面举出两个例子,把对O的原型(prototype)的修改放在obj的声明之前和之后的两种情况下,使用instanceof对obj作检测的结果对比:
上面这个例子中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。
也假设上面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。
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作检测的结果对比:
function F(){} function O(){} O.prototype = new F(); var obj = new O(); /* 以上两条语句等同于如下代码 var obj = (function(){ var obj1 = {}; var obj2 = {}; obj2.__proto__ = F.prototype; obj.__proto__ = obj2; return obj; })() */ console.log(obj instanceof O);//true console.log(obj instanceof F);//true console.log(obj.__proto__===O.prototype);//true 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。
function F(){} function O(){} var obj = new O(); o.prototype = new F(); console.log(obj instanceof O);//false console.log(obj instanceof F);//false console.log(obj.__proto__===O.prototype);//false 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。
相关文章推荐
- new和instanceof的内部机制
- new和instanceof的内部机制
- 从一个实例,看new FunctionName()的内部机制
- instanceof函数内部机制探析
- 看看GtkWindow如何被生出来的(gtk_window_new()的内部机制)
- 看看GtkWindow如何被生出来的(gtk_window_new()的内部机制).
- [zz]new FunctionName()的内部机制
- Window的内部机制(添加,删除,更新)
- ORACLE 内部运行机制图解
- Starling学习笔记分享,starling内部渲染机制与性能优化
- C++ static内部机制
- 物化视图及日志内部机制的研究
- 关于企业内部培训机制建立的一点点建议
- HDFS内部的认证机制
- 浅谈ASP.NET内部机制(三)
- VC++ 之MFC内部机制四
- (转)浅谈ASP.NET内部机制(七)
- Dot net 运行的内部机制
- 浅谈ASP.NET内部机制(三)
- Struts框架内部的值调用机制的研究