知道了显式原型prototype和隐式原型__proto__,我们就能很好的知道原型链是什么东西了。
说原型链之前再理几个概念:
实例隐式原型__proto__指向创建实例的构造函数的显示原型prototype。
实例可以通过__proto__调用在__proto__下的所有属性和方法。
所以,原型链就这样出来了:
function User() {}User.prototype.userEat = 'userEat';function Person() {}Person.prototype = new User();Person.prototype.personEat = 'personEat';function People(){}People.prototype = new Person();People.prototype.peopleEat = 'peopleEat';var people = new People();console.log(people.userEat);console.log(people.personEat);console.log(people.peopleEat); console.log(people.__proto__);
这边用到了构造继承,但是隐式原型确实是可以层层访问。
再看看这个:
function User() {}console.log(User.__proto__ === Function.prototype);console.log(Function.prototype.__proto__ === Object.prototype);console.log(User.__proto__.__proto__ === Object.prototype);
输出的都是true,因为User是函数对象,所以User的隐式原型__proto__指向Function的显示原型prototype,而函数也继承于对象,所以Function的隐式原型__proto__指向Object的显示原型prototype。
所以原型链就是这么简单,实例对象通过隐式原型__proto__可以获取构造函数的所有属性和方法,又因为这些构造函数的继承性,实例对象会一层一层向上查找,这些层级链接起来就是原型链。最终原型链的尽头是null。
console.log(people.__proto__.__proto__.__proto__.__proto__.__proto__);console.log(Object.prototype.__proto__);
得到的结果是null。
(完)