项目组由印度高端引入了一个脚本框架。当中用到了prototype来实现一些功能。
今天找了几篇关于javascript的prototype的文章读了下,有了点初步的理解,然后在纸上画了个关系图概括了一下自己的理解,最后发现和[1]文最后的附图不谋而合。
来看看[1]文最后的附图:
据说这图来自ECMA Script的标准。
个人对这图的一些理解,CF就是function的定义(可以类比为java中的class的定义),当中定义了p1和p2两个属性,当中有一个prototype对象(javascript内置定义的对象),指向的CFp是一个对象的实例。注意这里CF的prototype和CFp的关系是实线的,代表explicit prototype property。
而下面的cf1,cf2 ...则是CF的实例化,每个实例里的q1,q2就是CF定义中的p1,p2的实例化。
而cf1们和CFp的虚线关系是什么回事?
这实际上就是每个CF的实例(cf1, cf2...)中,都有一个__proto__对象,它直接指向的是CF的prototype对象,因此是间接指向CFp对象。
图中的关系写成伪代码大概是这样:
function CFp() { this.xxx = function(){...}; } function CF() { this.P1 = "p1"; this.P2 = "p2"; } CF.prototype = new CFp();//图中的实线关系:explicit prototype property var cf1 = new CF(); var cf2 = new CF(); ... cf1.xxx(); //这里就可以通过cf1的__proto__引用到CF的prototype对象从而调用到CFp的xxx方法
从这里可以看出,javascript的prototype的确有点静态(static)的意思,因为对于每个函数(类比java中的类)的定义,都有一个唯一的prototype对象。
而随着层次的增加,prototype会形成一个prototype chain,这个,可以说就是javascript实现继承效果的基础吧?
但是,对这个图还有一个疑问就是,左上角CF引出的虚线又是代表什么关系呢??
参考文献: