js奥义:原型与原型链(2)

回顾:上一篇讲了原型对象与prototype和__proto__(传送门 )三者之间的关系javascript

三:constructorhtml

  constructor [kənˈstrʌktə(r)] :构造器,  这是子类的__ptoto__对象和父类的prototype对象的一个属性,它一般指向父类自己java

function Fn() {
            this.n = 20
        }
        Fn.prototype.sing = function() {
            console.log(this.n)
        }
        var deb = new Fn()
        console.log(deb.__proto__.constructor === Fn) //true
        console.log(Fn.prototype.constructor === Fn)  // true

  这也进一步证实了 ,子类的__ptoto__对象全等于父类的prototype对象!函数

  到如今,咱们已经能够画出一个父类,子类,与prototype三者的关系图学习

 

 

上图是学习原型链的基础。 this

在这张图中:prototype

  prototype对象 :prototype是父类的一个属性,因为它的值是一个对象类型,于是它既能够看做是父类的属性,也能够认为是父类的一个隐式的对象,全部的函数都有一个prototype对象 !3d

         原型对象有一个constructor属性,它指向了父函数自己。父函数也能够经过自身的prototype属性找到这个原型对象;由这个父级实例的对象也能够经过__proto__属性htm

         找到这个原型对象。对象

  父级:因为父级是一个构造函数,它使用new关键字实例了子类,于是咱们能够认为,父级使用new关键字和子类产生了联系。同时,子类也能够经过__proto__对象的constructor找到自身的父级,这是

     因为自身的__proto__就是父级的prototype对象,本质上 是先经过__proto__属性找到父级的prototype对象,再经过prototype对象的constructor指向找到 其父级

  __proto__: 结合上一篇,__proto__属性隐式存在于每个obj对象身上,而prototype的值也是对象类型,这也说明,任何父类的prototype对象也都有一个__proto__属性!

       子类的__proto__其实就是一条锁链,指向其父类的prototype对象,咱们也能够得出一条结论:全部对象的__proto__都指向它的父类的prototype对象!

 

  

 

 

 

 

 

 基于constructor,咱们经过在原型对象的__proto__对象的constructor属性指向能够得知,原型对象的__proto__指向了Object.prototype . 

(Object对象是全部对象的共有父类,而对象的__proto__属性则指向它的构造函数的prototype对象!)

        console.log(deb.__proto__.__proto__ === Object.prototype) //true

  这句话的理解是:“对象的原型对象的原型对象是Object的原型吗” 

举个栗子:

  小明有爸爸妈妈,也有爷爷奶奶和外公外婆,有天他问妈妈:” 你的妈妈的妈妈是谁?“,妈妈指着外婆,告诉他:”个人妈妈是xxx,她是你的外婆“,而后小明的妈妈问外婆:”个人妈妈的妈妈是谁呢?“

  外婆指着天空说:” 我没有妈妈.“

  在这个例子里,假设全部人都有一个纽带(__proto__),用于指明本身的亲人,小明是一个对象(son),他用本身的纽带(son.__proto__)找到了本身的妈妈(son.__proto__),也就是prototype,

  而后他想知道本身的 外婆是谁,他的妈妈经过用本身的纽带(prototype.__proto__)告诉他,他的外婆是xxx(Object.prototype),而后妈妈也想知道本身的外婆(prototype.proto.proto)是谁,外婆经过本身的纽带 (Object.prototype.__proto__)想回答这个问题,但是没找到,因而告诉妈妈,什么都没有(null)

这虽是个简单的例子,却深入说明了一个原理:

    1.全部的对象都有一个__proto__属性,这个属性指向了本身父级的原型对象,

    2.Object对象是全部对象的共有父类

    3.Object对象的原型对象的__proto__是null

图解:

 

 

 

 这种经过原型链方式将原型对象与对象之间连接的 关系咱们就叫作原型链。

以上。

相关文章
相关标签/搜索