说到原型链首先要搞清楚什么是prototype和 __proto__
prototype 和 __proto__ 都是属性且都是对象的属性
区别在于 prototype 是函数对象的属性 (当成构造函数,定义它的原型对象)
而 __proto__是任意对象都有的属性 (指向自身构造函数的原型对象 )
看文字我也有点晕 举个例子吧
一.定义一个构造函数Programmer 通过this.来扩展
function Programmer(){
this.name = 'higher'
this.xxx = '...'
}
let bro = new Programmer();
二.通过prototype
每个函数对象有他的prototype属性所以我们也可以这样来扩展
Programmer.prototype = { //定义它的原型对象
name:'higher'
xxx :'...'
}
此时我们创建的新对象bro中有一个__proto__属性 也会被赋值 这个值也就是Programmer.prototype
接下来我们思考一下 bro.push()的运行结果及过程
可以看到 在我们的Programer中还没有定义一个push的方法
所以通过运行,控制台会报错 bro.push is not a function,但其实得到这个结果js经历了以下流程
1.我们会先检索自身有没有push方法(如果有直接调用,省略以下步骤)
2.再检索自身__proto__属性对象中有没有 (bro.__proto__) //Programmer.prototype //console.log(bro.__proto__ === Programmer.prototype )(true)
3.如果以上还没有找到push方法则会在其原型对象上找它的父,当前原型对象也是Object构造函数的实例对象 (bro.__proto__.__proto__) // Object.prototype //console.log(bro.__proto__.__proto__ === Object.prototype )(true)
4.一直这样循环找也不是事儿,所以还没找到就会返回内存中的空对象null了 (bro.__proto__.__proto__.__proto__) //null
以上便是对象方法的检索机制,也是原型链的过程(内容总结于max李的视频)
如有问题 欢迎指正讨论。