1. 前言
今天的重点复习的是JavaScript原型链。所谓是"
基础不牢,地动山摇",原型链作为继承等相关知识的基础,就显得尤为重要了。接下来以手绘原型链为基础,详解讲解下原型链以及相关的属性

2. 原型 以及原型链
2.1 prototype
- 其实函数在被创建时,会存在两个内容。一个是函数本身,另一个是
函数.prototype. 可以理解为函数天生就是双胞胎

- 每个函数上都会存在一个属性
prototype,这个属性指向函数.prototype 函数.prototype上存在属性constructor,该属性指向函数本身

function User() {}
console.log(User.prototype.constructor === User); // true
2.2 __proto__
- 每个实例都会存在属性**__proto__, 实例.__proto__** 会指向函数的原型对象

2.2.1 特例:
- 具体构造函数.__proto__ === Function.prototype。停停停!!! 不是只有实例上才有属性**__proto__** 吗,为什么函数也可以调用呢?
- 是因为具体的构造函数也是 Function 的实例
function Person() {}
const person = new Person();
// 实例.__proto__ 指向构造函数.prototype
console.log(person.__proto__ === Person.prototype); // true
console.log(person.__proto__ === Object.getPrototypeOf(person)); // true
// 特例:具体函数.__proto__ 指向了Function.prototype
console.log(Person.__proto__ === Function.prototype); // true
// 特例:函数本身.__proto__ === 指向了Function.prototype
console.log(Function.__proto__ === Function.prototype); // true
2.3 constructor
- 原型对象 prototype 存在属性
constructor, 该属性指向构造函数本身

function Person() {}
const person = new Person();
// 原型对象上存在属性<constructor> 指向
console.log(Person === Person.prototype.constructor);
// 实例的构造函数
console.log(person.constructor);
// person本身没有constructor属性
console.log(Object.prototype.hasOwnProperty.call(person, "constructor")); // false
// 其实是通过原型继承来的
console.log("constructor" in person); // true
2.4 实例以及原型
实例是通过属性
__proto__一直向上寻找属性,先是实例自己属性 => 原型属性 => 父类实例属性 => 父类原型属性… 以此类推

function User() {
this.name = "xxx1";
}
const u = new User();
console.log(u.name); // xxx1
function User1() {}
User1.prototype.name = "xxx2";
const u1 = new User1();
console.log(u1.name); // xxx2
function User2() {}
// User2.prototype.name = 'xxx3'
const u2 = new User2();
// 最起码保证u2.__proto__ 没有被重写
u2.__proto__.__proto__ = u;
console.log(u2.name); // xxx1
function User3() {}
const u3 = new User3();
u3.__proto__.__proto__ = u1;
console.log(u3.name); // xxx2
2.5 补充
- 所有
函数.__proto__都会指向Function.prototype - 所有
函数.prototype.__proto__都会指向Object.prototype
3. 总结
大致的原型链的知识就这么多了。其实只要各位能做到手绘原型链的程度,基本就算掌握了,剩余的就差多多练习了。好了不多说废话了,今天的分享到此结束。如果各位觉得有任何不对的地方或是有别的想法的,都可以在评论区给小编留言,欢迎来多多交流



















