关于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 相关文章推荐
jquery的ajax从纯真网(cz88.net)获取IP地址对应地区名
Dec 02 Javascript
jQuery AJAX 调用WebService实现代码
Mar 24 Javascript
浅谈javascript的数据类型检测
Jul 10 Javascript
onsubmit阻止form表单提交与onclick的相关操作
Sep 03 Javascript
js 利用className得到对象的实现代码
Nov 15 Javascript
jquery实现简单的自动播放幻灯片效果
Jun 13 Javascript
详解JavaScript中常用的函数类型
Nov 18 Javascript
jQuery Mobile动态刷新页面样式的实现方法
May 28 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
Jul 13 Javascript
微信小程序 实例应用(记账)详解
Sep 28 Javascript
利用JS实现点击按钮后图片自动切换的简单方法
Oct 24 Javascript
Bootstrap风格的WPF样式
Dec 07 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
mysql总结之explain
2012/02/27 PHP
php代码书写习惯优化小结
2013/06/20 PHP
php curl基本操作详解
2013/07/23 PHP
php使用smtp发送支持附件的邮件示例
2014/04/13 PHP
php+MySQL判断update语句是否执行成功的方法
2014/08/28 PHP
一个可绑定数据源的jQuery数据表格插件
2010/07/17 Javascript
JavaScript.The.Good.Parts阅读笔记(二)作用域&amp;闭包&amp;减缓全局空间污染
2010/11/16 Javascript
node.js中使用node-schedule实现定时任务实例
2014/06/03 Javascript
技术男用来对妹子表白的百度首页
2014/07/23 Javascript
jQuery实现控制文字内容溢出用省略号(…)表示的方法
2016/02/26 Javascript
javascript实现的猜数小游戏完整实例代码
2016/05/10 Javascript
Jquery揭秘系列:ajax原生js实现详解(推荐)
2016/06/08 Javascript
input获取焦点时底部菜单被顶上来问题的解决办法
2017/01/24 Javascript
详解关于react-redux中的connect用法介绍及原理解析
2017/09/11 Javascript
利用js给datalist或select动态添加option选项的方法
2018/01/25 Javascript
vue升级之路之vue-router的使用教程
2018/08/14 Javascript
layui table设置某一行的字体颜色方法
2019/09/05 Javascript
javascript设计模式 ? 备忘录模式原理与用法实例分析
2020/04/21 Javascript
jQuery 隐藏/显示效果函数用法实例分析
2020/05/20 jQuery
解决Vue使用bus总线时,第一次路由跳转时数据没成功传递问题
2020/07/28 Javascript
vue 添加和编辑用同一个表单,el-form表单提交后清空表单数据操作
2020/08/03 Javascript
[44:09]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第二局
2016/02/25 DOTA
Python实现的下载8000首儿歌的代码分享
2014/11/21 Python
使用Python对Csv文件操作实例代码
2017/05/12 Python
python中的随机函数小结
2018/01/27 Python
详解Python with/as使用说明
2018/12/13 Python
在Python运行时动态查看进程内部信息的方法
2019/02/22 Python
Python利用matplotlib绘制散点图的新手教程
2020/11/05 Python
城市观光通行证:The Sightseeing Pass
2018/04/28 全球购物
小学信息技术教学反思
2014/02/10 职场文书
公司成本主管岗位责任制
2014/02/21 职场文书
大学生党员批评与自我批评
2014/09/28 职场文书
党的群众路线剖析材料
2014/10/09 职场文书
手机销售员岗位职责
2015/04/11 职场文书
2015年信贷员工作总结
2015/04/28 职场文书
检举信的写法
2019/04/10 职场文书