重新认识原型和原型链三

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

欢迎关注Coding个人笔记公众号

猜你喜欢

转载自blog.csdn.net/wade3po/article/details/88547157
今日推荐