关于JavaScript 原型链的一点个人理解


Posted in Javascript onJuly 31, 2016

JavaScript借鉴了许多语言的特点;例如语法类Java、函数借鉴Scheme、原型继承借鉴自Self、正则表达式借鉴于Perl。(DC Javascript:语言精粹)。

     首先,每个JS是一门基于原型继承的面向对象的语言。里面数组是对象、函数是对象、“对象”当然还是对象。而且每个对象都有一个internal slot[[prototype]],这才是原型链连接起来的关键。诚然,我们可以为一个对象设置prototype property,但这又怎么样呢,这只是表象;后面暗藏杀机。

    好,那我可以用isPrototypeOf()来检验某个对象是不是另一个对象的原型;然而这也是基于[[prototype]]链的。

   举个例子:

//建立一个函数

    function foo () {} 

    //修改函数的prototype property  

    foo.prototype = {

         name : "foo.prototype" 
              };
     //建立一个实例 

      var a = new foo();

    //重写 a 的默认原型,本应该是foo.prototype.
       a.prototype = {
         name : "a.prototype"
      };

    下面的问题是foo.prototype是不是a的原型呢?!

    这要分开来看:一方面a.prototype确实是{ name : "a.prototype"};但是,foo.prototype.isPrototypeOf(a)结果是true.

    下面来看一看具体的关系:(使用--->表示不明显的[[prototype]]链,---表示prototype property关系)

        Function ---> Function.prototype--->Object.prototype

                          Function.prototype <--- foo---foo.prototype ------>Object.prototype 。

    另外,Number、Boolean、String等的[[protptype]]仍然是Fuction.prototype对象。Function.prototype对象为“function”,内部不含[[construct]]故而不可做构造函数用;实际上Function.prototype类似:function () {}。“function”类型除了[[prototype]]internal slot外,还有prototype属性。每个函数总是相伴有一个prototype对象:this.prototype = {constructor:this}(一个普通对象)。这个普通对象的[[prototype]]连接到Object.prototype.

   那构造函数建立的实例对象的[[prototype]]是Object.prototype吗?

          该实例的[[prototype]]是由构造函数的prototype property初始化的,注意不是函数的[[prototype]].所以如果是由Object这个函数构造的对象,那么就确实是.

  Object是函数,它的prototype是大名鼎鼎的Object.prototype(有点废话的意思),但是它的[[prototype]]指向Function.prototype.请看下面:

                                                          Object----->Function.prototype------>Object.prototype.

 如何改变这个[[prototype]]链呢?

     可以采用var a = Object.create(obj)的形式,或Object.setPrototypeOf(objA,objB)的形式。我想例子就不用举了,因为关系很简单;况且我只举得出一些蹩脚的例子。没有意义。

 最后一个问题,行为委托是基于[[prototype]]链吗?

      是的,也是这样。

Javascript 相关文章推荐
提高 DHTML 页面性能
Dec 25 Javascript
使用时间戳解决ie缓存的问题
Aug 20 Javascript
JavaScript操作cookie类实例
Mar 31 Javascript
基于jquery实现智能表单验证操作
May 09 Javascript
详解js实现线段交点的三种算法
Aug 09 Javascript
JS异步文件分片断点上传的实现思路
Dec 25 Javascript
如何在Angular2中使用jQuery及其插件的方法
Feb 09 Javascript
深入理解在JS中通过四种设置事件处理程序的方法
Mar 02 Javascript
Vue.JS实现垂直方向展开、收缩不定高度模块的JS组件
Jun 19 Javascript
iview Upload组件多个文件上传的示例代码
Sep 30 Javascript
JavaScript实现获取两个排序数组的中位数算法示例
Feb 26 Javascript
详解vue-cli中使用rem,vue自适应
May 06 Javascript
jquery实现界面无刷新加载登陆注册
Jul 30 #Javascript
AngularJS ng-change 指令的详解及简单实例
Jul 30 #Javascript
Javascript中级语法快速入手
Jul 30 #Javascript
AngularJS ng-blur 指令详解及简单实例
Jul 30 #Javascript
AngularJS ng-bind-template 指令详解
Jul 30 #Javascript
AngularJS ng-bind-html 指令详解及实例代码
Jul 30 #Javascript
AngularJS ng-bind 指令简单实现
Jul 30 #Javascript
You might like
php 使用post,get的一种简洁方式
2010/04/25 PHP
使用PHP实现Mysql读写分离
2013/06/28 PHP
编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法
2014/06/27 PHP
thinkphp3.2框架中where条件查询用法总结
2019/08/13 PHP
为javascript添加String.Format方法
2020/08/11 Javascript
javascript中[]和{}对象使用介绍
2013/03/20 Javascript
详解AngularJS Filter(过滤器)用法
2015/12/28 Javascript
谈谈JavaScript的New关键字
2016/08/26 Javascript
Bootstrap popover用法详解
2016/12/22 Javascript
js实现带缓动动画的导航栏效果
2017/01/16 Javascript
js浏览器滚动条卷去的高度scrolltop(实例讲解)
2017/07/07 Javascript
jQuery实现为动态添加的元素绑定事件实例分析
2018/09/07 jQuery
angular4+百分比进度显示插件用法示例
2019/05/05 Javascript
详解Vue.js 作用域、slot用法(单个slot、具名slot)
2019/10/15 Javascript
Js代码中的span拼接问题解决
2019/11/22 Javascript
JavaScript实现京东放大镜效果
2019/12/03 Javascript
JS中FileReader类实现文件上传及时预览功能
2020/03/27 Javascript
详解JavaScript数据类型和判断方法
2020/09/04 Javascript
python3安装pip3(install pip3 for python 3.x)
2018/04/03 Python
Python爬虫使用脚本登录Github并查看信息
2018/07/16 Python
Python模块/包/库安装的六种方法及区别
2020/02/24 Python
浅谈在django中使用filter()(即对QuerySet操作)时踩的坑
2020/03/31 Python
Python使用sqlite3模块内置数据库
2020/05/07 Python
python图片验证码识别最新模块muggle_ocr的示例代码
2020/07/03 Python
python 获取字典特定值对应的键的实现
2020/09/29 Python
需要知道的CSS3动画技术
2010/01/01 HTML / CSS
Fossil美国官网:化石手表、手袋、首饰及配饰
2019/02/17 全球购物
Charles&Keith美国官方网站:新加坡快时尚鞋类和配饰零售商
2019/11/27 全球购物
分厂厂长岗位职责
2013/12/29 职场文书
诚信考试倡议书
2014/04/15 职场文书
预备党员群众路线教育实践活动思想汇报2014
2014/10/25 职场文书
2014年语文教学工作总结
2014/12/17 职场文书
辩论赛新闻稿
2015/07/17 职场文书
退休职工欢送会致辞
2015/08/01 职场文书
30岁前绝不能错过的10本书
2019/08/08 职场文书
十大最帅动漫男主 碓冰拓海上榜,第一是《灌篮高手》男主角
2022/03/18 日漫