原型

每一个函数都包含一个 prototype 属性,这是一个指针指向 “原型对象” (prototype object)。每一个函数都包含不同的原型对象。当将函数用作构造函数的时候,新创建的对象(实例)会从原型对象上继承属性。

  1. /**
  2. * 定义一个构造函数(类)
  3. */
  4. function Person(name) {}
  5. /**
  6. * 实例属性
  7. */
  8. Person.prototype.age = 18;
  9. /**
  10. * 实例方法
  11. */
  12. Person.prototype.eat = function () {
  13. console.log('我会吃饭');
  14. };
  15. /**
  16. * 通过new关键字实例化出一个xiaoming实例
  17. * xiaoming继承了Person的age实例属性和eat实例方法
  18. */
  19. const xiaoming = new Person('a');
  20. /**
  21. * 通过new关键字实例化出一个libai实例
  22. * libai继承了Person的age实例属性和eat实例方法
  23. */
  24. const libai = new Person('b');

关系图

原型 - 图1

调试工具图如下
image.png

原型链

假设一个原型对象等于另一个类型(构造函数)的实例,另一个类型的原型对象又等于另一个类型的实例。就像这样一层层递进,就构成了实例与原型的链条,这个就是所谓的原型链。

  1. function Animal(name) {}
  2. Animal.prototype.name1 = 'xiaoming';
  3. function Cat(name) {}
  4. Cat.prototype = new Animal();
  5. Cat.prototype.name2 = 'libai';
  6. const cat1 = new Cat();
  7. cat1.name = 'xiaohong';
  8. console.log(cat1);

关系图

原型 - 图3

调试工具图如下
image.png

原型链(扩展)

  • 原型链的本质是链表,原型链上的节点是各种原型对象,例如 Function.prototypeObject.prototypeArray.prototype
  • 原型链通过 proto属性连接各种原型对象

原型链指向

  • object -> Object.prototype -> null
  • function -> Function.prototype -> Object.prototype -> null
  • array -> Array.prototype -> Object.prototype -> null