javascript原型继承分析(prototype)(补充版)
2014-07-17 17:46
561 查看
转自 http://blog.csdn.net/fjslovejhl/article/details/11879471
上一篇文章也是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。。。。
上一篇文章也是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。。。。
相关文章推荐
- javascript原型继承分析(prototype)(补充版)
- javascript原型继承分析(prototype)
- javascript原型继承分析(prototype)
- 详解JavaScript中基于原型prototype的继承特性
- Javascript对象原型prototype和继承
- javascript 对象及原型继承有关的属性:constructor、prototype、isPrototypeOf、instanceof、in 、hasOwnProperty 等等
- 史上最通俗易懂的关于JavaScript 的 prototype、原型继承、this指针的讲解
- 面向对象的Javascript - 通过原型(Prototype)实现继承
- javascript中的原型(prototype)及原型链的继承方式
- 理清javascript中prototype、__proto__、Object、Function的关系,更好地理解原型继承
- javascript学习笔记(九)javascript中的原型(prototype)及原型链的继承方式
- JavaScript之原型继承prototype
- JavaScript原型继承之基础机制分析
- javascript基于原型链的继承及call和apply函数用法分析
- JavaScript的原型链继承__propt__、prototype、constructor的理解、以及他们之间相互的关系。
- javascript prototype的深度探索不是原型继承那么简单第1/3页
- Javascript原型与继承【prototype】
- JavaScript面向对象编程之prototype原型与继承
- JavaScript 中原型继承(prototype-based inheritance)的原理
- 从0开始学react netive:2.Javascript创建对象的方式_prototype原型的概念_原型继承