什么是原型呢?
原型:每个函数都有一个 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中的继承。当一个对象需要继承另个对象的属性和方法时,可以将父对象设置为
子对象的原型对象,从而使子对象能够沿着原型链访问父对象身上的属性和方法。
原型链有什么缺点呢?
- 比较耗时。在原型链上查找比较耗时,对性能有副作用,当然一般情况下没有影响,除非性能要求极为苛刻。
- 试图访问不存在的属性和方法时会遍历整个原型链。