关于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 相关文章推荐
通过Unicode转义序列来加密,按你说的可以算是混淆吧
May 06 Javascript
JQuery AJAX实现目录浏览与编辑的代码
Oct 21 Javascript
COM中获取JavaScript数组大小的代码
Nov 22 Javascript
Javascript变量函数浅析
Sep 02 Javascript
js面向对象设计用{}好还是function(){}好(构造函数)
Oct 23 Javascript
让网页跳转到指定位置的jquery代码非书签
Sep 06 Javascript
jquery中$(#form :input)与$(#form input)的区别
Aug 18 Javascript
JS中call/apply、arguments、undefined/null方法详解
Feb 15 Javascript
jQuery实现的导航下拉菜单效果
Jul 04 Javascript
jQuery ajax请求struts action实现异步刷新
Apr 19 jQuery
vue-lazyload图片延迟加载插件的实例讲解
Feb 09 Javascript
vue-router定义元信息meta操作
Dec 07 Vue.js
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堆排序(heapsort)练习
2013/11/13 PHP
php实现用于计算执行时间的类实例
2015/04/18 PHP
在WordPress中使用wp-cron插件来设置定时任务
2015/12/10 PHP
启用OPCache提高PHP程序性能的方法
2019/03/21 PHP
微信支付之JSAPI公众号支付详解
2019/05/15 PHP
Laravel如何同时连接多个数据库详解
2019/08/13 PHP
php实现对短信验证码发送次数的限制实例讲解
2021/03/04 PHP
input 高级限制级用法
2009/03/26 Javascript
javascript静态页面传值的三种方法分享
2013/11/12 Javascript
javaScript年份下拉列表框内容为当前年份及前后50年
2014/05/28 Javascript
jQuery及JS实现循环中暂停的方法
2015/02/02 Javascript
JS实现让网页背景图片斜向移动的方法
2015/02/25 Javascript
jQuery简单创建节点的方法
2016/09/09 Javascript
详解angularjs中的隔离作用域理解以及绑定策略
2017/05/31 Javascript
Angularjs在360兼容模式下取数据缓存问题的解决办法
2017/06/22 Javascript
微信小程序 数据绑定及运算的简单实例
2017/09/20 Javascript
详解项目升级到vue-cli3的正确姿势
2019/01/28 Javascript
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
vscode配置vue下的es6规范自动格式化详解
2019/03/20 Javascript
Node.js实现一个HTTP服务器的方法示例
2019/05/13 Javascript
electron实现静默打印的示例代码
2019/08/12 Javascript
vue不操作dom实现图片轮播的示例代码
2019/12/18 Javascript
浅析JS中NEW的实现原理及重写
2020/02/20 Javascript
Python中的条件判断语句基础学习教程
2016/02/07 Python
利用python将图片转换成excel文档格式
2017/12/30 Python
Pycharm简单使用教程(入门小结)
2019/07/04 Python
python中将两组数据放在一起按照某一固定顺序shuffle的实例
2019/07/15 Python
CSS3弹性盒模型flex box快速入门心得(必看篇)
2016/05/24 HTML / CSS
关于canvas绘制模糊问题的解决方法
2019/09/24 HTML / CSS
在C语言中实现抽象数据类型什么方法最好
2014/06/26 面试题
应届毕业生个人求职自荐信
2014/01/06 职场文书
学年末自我鉴定
2014/01/21 职场文书
收银出纳员岗位职责
2014/02/23 职场文书
副科竞争上岗演讲稿
2014/05/12 职场文书
python 常用的异步框架汇总整理
2021/06/18 Python
Go语言应该什么情况使用指针
2021/07/25 Golang