最近在准备面试,看到原型链的指向这块儿真的是一脸懵,恰巧今天也是得了高人指点就趁此机会整理一波。
1.什么是prototype和__proto__?
正如mdn里面“每个实例对象(object)都有一个私有属性(称之为__proto__)指向它的构造函数的原型对象(prototype)。该原型对象也有一个自己的原型对象__proto__,层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节。”和
“在 JavaScript 中,函数(function)是允许拥有属性的。所有的函数会有一个特别的属性 —— prototype 。”
所以prototype是函数才会有的,也叫显式原型,而__proto__则是对象的专属(私有属性),也叫隐式原型。
那么概念出来了,接下来就开始进入正题
2.Object.prototype.__proto__=== null,这个直接记住就行了。
3.对象、构造函数、Function的关系,及Object与他们的关系。
let func = function(){}
let obj = new func()
obj.__proto__ === func.prototype
func.__proto__ === Function.prototype
可以理解为 爷爷辈:Function ;父辈:func:子:obj。
而Object就比较神奇了,由于它本身是构造函数可以new对象,所以
Object.__proto__ === Function.prototype
从这点说,它算是父辈。但是作为万物之父的Object,原则上所有的对象都是它的儿子,而Function.prototype偏偏就是Function的原型对象,属于对象,所以
Function.prototype.__proto__ === Object.prototype
换句话说,Object可以对Function说,虽然我排在你儿子辈,但是我是你prototype的父辈,咱们各论各的,谁也不占谁的便宜。
4.instanceof
instanceof就是在它左边的东西,沿着__proto__一直往上找,需要等于右边的prototype
Object instanceof Function
以上为true是因为,Object的隐式对象等于Function的显式对象
Object.__proto__ === Function.prototype
另外,还有一个需要特别注意的,就是
Function instanceof Object
以上为true,但是其实
Function.__proto__ !== Object.prototype
Function.__proto__.__proto__ === Object.prototype
就可以得出
Function.__proto__ === Function.prototype
Function是唯一一个显式对象等于隐式对象的特例。
5.构造关系constructor
就理解成,也是个找父级的的过程(暂时没发现可以证伪)。就好像,你用正式的语气(__proto__)叫“父亲”,你父亲就会稍微拿捏一下给你正式(prototype)的回答。但是你如果亲切的(constructor)叫“爸爸”,你父亲就会直接回应你。
let func = function(){}
let obj = new func()
obj.__proto__ === func.prototype
obj.constructor === func
func.__proto__ === Function.prototype
func.constructor === Function
一直就觉得原型链这块比较枯燥,也就是想换个角度理解看看,有什么错误之处还望大家指证,感谢!