new和instanceof的内部机制
来源:互联网 发布:nestopia mac 连发 编辑:程序博客网 时间:2024/06/18 13:28
首先我们来看看obj = new o()这条语句发生了什么:
var obj = (function(){ var obj = {}; obj.__proto__ = o.prototype; //其他赋值语句... return obj;})();
也就是说如果不对o的原型(prototype)作修改,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 7 console.log(obj instanceof O);//true 8 console.log(obj instanceof F);//true 9 console.log(obj.__proto__===O.prototype);//true10 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);//false10 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。
<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
- new和instanceof的内部机制
- [zz]new FunctionName()的内部机制
- GetMessage和PeekMessage的内部机制
- HashMap的原理和内部实现机制
- sleep和wait的内部机制
- ViewPage和内部View的事件机制
- new写在循环内部和外部的区别
- strcpy的内部机制
- LocalActivityManager的内部机制
- 线程的内部机制
- LocalActivityManager的内部机制
- ThreadLocal的内部机制
- Activity的内部机制
- PendingIntent的内部机制
- LocalActivityManager的内部机制
- PendingIntent的内部机制
- PendingIntent的内部机制
- Window的内部机制
- SharePoint 用户配置文件服务
- CRC8校验
- SQL SERVER的recovery interval
- window.prompt()方法的学习
- javaScript 中的 with 和 this 的用法
- new和instanceof的内部机制
- sql 语句 的一些写法
- 计算机网络3
- cf 222B 数组行列交换操作
- PKU 1577 Falling Leaves
- 上百个Android开源项目分享
- OD根据API下断点调试程序
- Handler的用法总结
- RMAN 备份异机恢复 并创建新DBID