QTNND的烧脑原型链
该篇共1542字,需阅读大约7分钟
😍原型链介绍
原型对象
说个简单的开头
JS中万物都基于对象
- 函数的
prototype
指向原型对象
- 原型对象的
constructor
指向函数
- 原型对象上定义的属性和方法可以被所有与之关联的实例对象共享和继承
prototype
是函数独有的
__proto__
属性,它是对象所独有的
- JS创建函数的时候,都会生成一个
prototype
属性,这个属性指向了一个对象,这个对象就是该函数的原型对象,
该对象中包含一个constructor
属性,该属性指向的是该函数。
2. 声明该函数的实例对象,该对象实现了一个__proto__
属性,指向该实例对象(ha)
的原型对象({constructor:f})
,因此我们可以把函数的prototype
和实例对象的__proto__
进行对等比较,结果当然就是true
啦
原型链
原型链很简单 看以下代码就懂了
构造函数、实例和原型的关系
构造函数是用来构造实例的函数。每个实例都有一个原型,原型又指向构造函数的原型
继承
构造函数继承
使用call()将Parent的this指向Child的实例,实现继承。
优点
- 创建实例时可以向父类构造函数传参。
- 每个字类实例都有一份自己的父类实例,修改父类实例属性不会影响其他继承同一父类的子类。
缺点
- 只继承父类构造函数中的属性和方法,无法继承原型对象上的内容。
- 无法复用
原型链继承
重写原型对象
优点
- 函数复用,子类可使用父类属性和方法。
- 子类可直接方问父类原型对象上的属性方法。
缺点
- 无法向父类构造函数传参。
- 父类引用属性会共享到所有子类,一个子类修改了引用属性,其他子类也会受影响,因为操作的是同一个内存地址。
- 父类私有变量会在子类中暴露。
组合继承
构造函数+原型链
优点
- 继承父类实例属性和原型对象的所有属性方法(私有除外)
- 避免了引用类型的属性被所有实例共享问题(原型链继承)。
缺点
- 调用两次父类实例,性能影响
寄生式继承
原型式继承+增强对象
优点
- 继承父类实例属性和原型对象的所有属性方法(私有除外)
- 避免了引用类型的属性被所有实例共享问题(原型链继承)。
缺点
- 调用两次父类实例,性能影响
寄生式继承
子类的构造函数中,增强父类实例的功能
优点
- 避免了引用类型的属性被所有实例共享问题(原型链继承)。
缺点
- 无法实现函数复用,每个子类内部都实例化了父类。
- 能访问到父类私有变量,其实就是子类里塞了父类实例。
寄生组合式继承
子类的构造函数中,增强父类实例的功能
优点
- 避免了引用类型的属性被所有实例共享问题(原型链继承)。
- 只调用了一次Parent构造函数
缺点
- 无法实现函数复用,每个子类内部都实例化了父类。
- 能访问到父类私有变量,其实就是子类里塞了父类实例。