对于原型链一直学的很懵,什么prototype __ proto __,实在是绕啊。
有一张原型链的图解(如下)如果是刚刚入门肯定被搞得晕头转向,这一个箭头那一个箭头的。今天把他拆开进行分析。
首先 函数才有 prototype 原型,对象 有 __ proto __ 属性。
上面的图就说明了 prototype 和 __proto __ 的区别
再到代码上来看看
let obj = {};
console.log(obj.prototype); //undefied
console.log(obj.__proto); //Object{ ...拥有的一些方法}
let fn = function(){}
console.log(fn.prototype) // fn {}
console.log(fn.__proto__) //function(){}
再来看一张图
- 有一个 Person 构函数, new出来一个 person1 的函数。
- person1 的constructor 的指向原构造函数
- person1的 __ proto __ 指向 Person.prototype
- Person.prototype 的 constructor 是指向 Person的
- Person.prototype 的 prototype 是 Person.prototype
还是有点绕 ,再看看代码就能明白了
var Person = function(){
}
var person1 = new Person()
person1.constructor===Person; //true
Person === Person.prototype.constructor; //true
person1.__proto__ === Person.prototype; //true
person1.__proto__.constructor === person1.constructor //true
原型知道了,再看看原型l链
所有函数的prototype 指向 Object.prototype
也就是
person1 ——> Person.prototype ——> Object.prototype
在 js里万物皆对象,函数也属于一个对象 所有就多了
Person ——> Function.prototype ——> Object.prototype
到这是不是就会觉得这个原型链会一直这么走下去,没有终点,但是 在控制输出
Object.prototype.__ proto __ 会指向 null
Object.prototype.__ proto __
//null
所有原型链是有顶端的