从实现角度分析js原型链欢迎到我的博客阅读:《从实现角度分析js原型链》网上已经有很多介绍原型链的优质文章,例如:https://github.com/mqyqingfeng/blog/issues/2https://github.com/creeperyang/blog/issues/9作为补充,我们从实现的角度来分析一下ps:本文假设您已经对原型链有所了解。不懂的建议看一下上面两篇文章,画个图。第一步创建函数时,会创建两个对象:函数本身和它的原型对象。所以我们可以先画这样一个关系图:ps:圆代表函数,矩形代表对象。第二步是函数创建的对象。它的原型是函数的原型对象。然后修改如下关系图:第三步函数原型对象为Object原型对象。然后修改关系图:第四步js的内置函数对象也满足这个规则。然后修改关系图:Step5.Function的原型对象是一个函数。然后修改关系图:Step6.所有函数的原型都是一样的,都是Function的原型对象。然后修改如下关系图:Step7对象原型为null,表示不应该存在。最后得到如下关系图:一些疑惑instanceofObjectinstanceofFunction//trueFunctioninstanceofObject//true首先要确定的是instanceof运算符等价于下面的代码://LinstanceofRfunctioninstance_of(L,R){varO=R.prototype;//获取函数的原型对象R=L.__proto__;//获取对象L的原型while(true){//遍历原型链if(L===null)returnfalse;if(O===L)//函数R的原型对象在对象L的原型链上returntrue;L=L.__proto__;对于ObjectinstanceofForFunction,相当于Object.__proto__===Function.prototype因为所有函数的原型都是Function的原型对象,所以是真的对于FunctioninstanceofObject,相当于Function.__proto__===Object.prototype因为Object的原型对象在原型链的顶端,所以Object.prototype一定在Function的原型链上,也就是trueFunctionFunction.__proto__===Function.prototype为此,可以先对上面的关系图进行改造:可以看出,所有的函数都有对应的原型对象。所有函数的原型都是Function。根据原型链上的1和2可以得出Function.__proto__===Function.prototype至于为什么Function.prototype是函数,可以先看下面的例子:prototype是Array类型,而Map.prototype是Map类型,Set.prototsype是Set类型。因此,为了保持一致性,Function.prototype也应该是Function类型。完参考:https://github.com/mqyqingfeng/Blog/issues/2https://github.com/creeperyang/blog/issues/9https://www.ibm.com/developerworks/cn/web/1306_jiangjj_jsinstanceof/index.htmlhttps://stackoverflow.com/questions/7688902/what-is-functions-protohttps://stackoverflow.com/questions/572897/how-does-javascript-prototype-work
