原型和原型链

发布时间 2023-12-28 22:09:53作者: 前端自信逐梦者

什么是原型呢?

原型:每个函数都有一个 prototype 属性,这个属性称之为原型,又由于这个属性的值是一个对象,所以称之为原型对象

有什么作用呢?

  • 存放一些属性和方法,将其挂载到原型身上
  • 在js中实现继承
const arr = new Array(1,2,3);
arr.reverse();

数组中的方法都是挂载到Array构造函数的原型身上的

构造函数Array -----> Array.prototype原型
构造函数Array -----> arr实例对象
arr实例对象 -----> Array.prototype原型

为什么实例就可以直接使用原型身上的方法呢?

这是因为每个对象都有一个 __proto__ 属性
作用: 指向它的原型对象

console.log(arr.__proto__ === Array.prototype) // true

这时候就引出了原型链

什么是原型链呢?

原型链是js实现继承的一种机制。
对象都有一个私有属性(__proto__)属性,这个属性指向它的构造函数的原型对象(prototype),
那么原型对象也是一个对象,它也有__proto__属性,指向原型对象的原型对象,层层向上找,
直到一个对象的原型对象是null,这样一层一层形成的链式结构称之为原型链。
的链式结构就称之为原型链。

如何获取对象的原型对象呢?

  • 构造函数.prototype
  • 实例对象.__proto__
  • Object.getPrototypeOf(实例对象)
let p = new Person();
// 获取原型对象
console.log(Person.prototype);
console.log(p.__proto__);
console.log(Object.getPrototypeOf(p));

原型链的作用?

原型链的作用在于实现了js中的继承。当一个对象需要继承另个对象的属性和方法时,可以将父对象设置为
子对象的原型对象,从而使子对象能够沿着原型链访问父对象身上的属性和方法。

原型链有什么缺点呢?

  • 比较耗时。在原型链上查找比较耗时,对性能有副作用,当然一般情况下没有影响,除非性能要求极为苛刻。
  • 试图访问不存在的属性和方法时会遍历整个原型链。