Skip to content

原型

什么是原型

原型是 JavaScript 对象相互继承特性的机制,每个函数都会有一个属性prototype,即原型对象,原型对象中必定有个属性为constructor(构造函数),其引用当前函数本身。在原型对象中可以声明公共的方法、属性,有了原型对象就可以通过构造函数来实现继承。

原型涵盖了构造函数,原型对象,实例,他们的关系如下:

  1. 构造函数通过 new 操作符可以实例化一个对象
  2. 构造函数通过 prototype(显示原型)找到原型对象
  3. 实例通过proto(隐式原型)找对原型对象
  4. 原型对象中包含了构造函数和公共属性与方法,通过 class 声明的方法都会在原型对象中存储着。

实例

通过构造函数创建的对象为实例

原型链

若在访问实例属性时若自身没有该属性会通过proto来获取原型对象上的属性,若原型对象上还是没有,会继续通过proto看原型的原型对象上有无属性,直到proto为 null,则会输出 undefined,这个过程就是原型链。

原型

原型在可以节约内存占用,将公共的方法、属性存放在原型对象上,所有该类型的实例都能访问到这些属性、方法,可以节约内存空间。在复用性可以实现继承,减少了代码冗余。

例子

ts
function A() {}
const a = new A();
// 实例通过隐式原型获取到原型对象
console.log(a.__proto__ === A.prototype);
// A实例通过隐式原型获取到函数的原型对象
console.log(A.__proto__ === Function.prototype);
// 函数的原型对象(一个对象实例)的原型就是对象的原型对象
console.log(Function.prototype.__proto__ === Object.prototype);
// 对象的原型对象的原型为null
console.log(Object.prototype.__proto__ === null);
function A() {}
const a = new A();
// 实例通过隐式原型获取到原型对象
console.log(a.__proto__ === A.prototype);
// A实例通过隐式原型获取到函数的原型对象
console.log(A.__proto__ === Function.prototype);
// 函数的原型对象(一个对象实例)的原型就是对象的原型对象
console.log(Function.prototype.__proto__ === Object.prototype);
// 对象的原型对象的原型为null
console.log(Object.prototype.__proto__ === null);