原文链接:https://note.noxussj.top/?source=helloworld
什么是原型?
每一个函数都包含一个 prototype 属性,这是一个指针指向 "原型对象" (prototype object),也就是我们平时说的原型。每一个函数都包含不同的原型对象。当将函数用作构造函数的时候,新创建的对象(实例)会从原型对象上继承属性。
1/** 2 * 定义一个构造函数(类) 3 */ 4function Person(name) {} 5 6/** 7 * 实例属性 8 */ 9Person.prototype.age = 18 10 11/** 12 * 实例方法 13 */ 14Person.prototype.eat = function () { 15 console.log('我会吃饭') 16} 17 18/** 19 * 通过 new 关键字实例化出一个 xiaoming 实例 20 * xiaoming 继承了 Person 的 age 实例属性和 eat 实例方法 21 */ 22const xiaoming = new Person('a') 23 24/** 25 * 通过 new 关键字实例化出一个 libai 实例 26 * libai 继承了 Person 的 age 实例属性和 eat 实例方法 27 */ 28const libai = new Person('b')
关系图

调试工具图如下

原型链
假设一个原型对象等于另一个类型(构造函数)的实例,另一个类型的原型对象又等于另一个类型的实例。就像这样一层层递进,就构成了实例与原型的链条,这个就是所谓的原型链。
1function Animal(name) {} 2Animal.prototype.name1 = 'xiaoming' 3 4function Cat(name) {} 5Cat.prototype = new Animal() 6Cat.prototype.name2 = 'libai' 7 8const cat1 = new Cat() 9cat1.name = 'xiaohong' 10 11console.log(cat1)
关系图

调试工具图如下

原型链(扩展)
- 原型链的本质是链表,原型链上的节点是各种原型对象,例如 Function.prototype 、Object.prototype、Array.prototype ...
- 原型链通过 proto 属性连接各种原型对象
原型链指向
- object -> Object.prototype -> null
- function -> Function.prototype -> Object.prototype -> null
- array -> Array.prototype -> Object.prototype -> null
- ...
