Appearance
原型
什么是原型
原型是 JavaScript 对象相互继承特性的机制,每个函数都会有一个属性prototype
,即原型对象,原型对象中必定有个属性为constructor
(构造函数),其引用当前函数本身。在原型对象中可以声明公共的方法、属性,有了原型对象就可以通过构造函数来实现继承。
原型涵盖了构造函数,原型对象,实例,他们的关系如下:
- 构造函数通过 new 操作符可以实例化一个对象
- 构造函数通过 prototype(显示原型)找到原型对象
- 实例通过proto(隐式原型)找对原型对象
- 原型对象中包含了构造函数和公共属性与方法,通过 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);