首页
学习
活动
专区
圈层
工具
发布

重新认识原型和原型链三

知道了显式原型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。

(完)

举报
领券