欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-13 10:52:59
javascript借鉴了许多语言的特点;例如语法类java、函数借鉴scheme、原型继承借鉴自self、正则表达式借鉴于perl。(dc javascript:语言精粹...

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]]链吗?

      是的,也是这样。