javascript原型继承分析(prototype)(补充版)

来源:互联网 发布:淘宝男鞋拍照视频教程 编辑:程序博客网 时间:2024/06/07 00:47

上一篇文章也是javascript原型继承的东西,不过觉得上一篇讲的不够详细,尤其是对于Function这部分,可能是当时自己也还有几个东西没有搞清楚。。。所以后来自己又实验了一把,这次把一些东西再补上。。。

现在突然觉得,对于javascript语言本身来说,无非就是两个链:

(1)scope链,这个与函数的作用域有关,是javascript闭包的基础

(2)原型链,或者说prototype链,这个的作用就不说了。。大家都懂得

这两个链条构成了javascript语言世界的核心。。。

这里有个东西需要为上一篇的文章澄清一下,所谓的prototype链,指的是ECMA标准不可见的__proto__([[prototype]])链条,而不是函数对象本身所具有的prototype属性,这个属性是可见的,可以将它看做是javascript引擎为函数对象额外附送了一个prototype属性,它指向了一个对象,而这个对象的constructor属性将指向函数本身,而这个对象的__proto__属性则执行Ojbect函数的prototype属性指向的对象。

这里好像文字有点太多了。。。下面就来上图吧,首先上一张重量级的图形,算是最重要的一张图吧,而且数据都是自己写代码实验测试出来的。。。



上面的照片就是最为重要的图了,这些数据也都是自己写代码测出来的。。。这里多了一个名字叫Empty名字的function,而且他是Object和Function这两个函数的__proto__,而这个函数的实现本身则是为空的。这里可以将这个叫Empty的function看成一个function与object的中间产物,因为它的prototype属性是undefined,而他的__proto__这是Object的prototype。

另外还有一个很重要的东西,那就是Object和Function这两个函数,或者说这两个对象的prototype是只读的(这里的只读只的是prototype这个域的值只读,不代表其指向的对象不能修改,只不过是不能给prototype赋予新的对象而已)。。。这个很重要。。。这个也是写代码测试出来的,有兴趣也可以自己去试试就知道了。。

好了,接下来来看看我们自己定义一个函数之后的情况:



这里就是自己申明了一个名字为Fjs的函数之后的图形,这里它的__proto__的是前面提到的名字叫Empty的函数,这个也很好理解,毕竟这个函数是Function这个函数构造出来的嘛,它的__proto__自然应该执行Function的prototype。

这里就是函数对象javascript引擎会自动为其分配一个prototype属性,然后各个域的指向在图上也就说的很清楚了,因为是一个对象,那么它的__proto__就自然应该指向Object的prototype无可厚非了。。。


最后再上一张用Fjs函数作为构造函数创建一个对象之后的图形吧:



那么到这里位置,真个原型链就算表现的很比较的全面了吧。。。其实这里也可以看到一个顶级的对象,那就是Object的prototype。。。。