回顾:上一篇讲了原型对象与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
图解:
这种经过原型链方式将原型对象与对象之间连接的 关系咱们就叫作原型链。
以上。