工厂模式
创建多个对象相似的问题
创建函数,return 一个对象
缺点
功能相同的每个方法都要在每个对象上重新创建一次,空间内容没有得到优化
构造函数模式
添加new 实例调用方法, 去除显示定义的对象,用this代替原有对象,构造函数默认返回this,不需要return
缺点
功能相同的每个方法都要在每个对象上重新创建一遍,空间内存没有得到优化
原型模式
func.prototype 就是原型,它是一个对象,称为原型对象
通过func.prototype.method 可以共享方法,不会反复开辟空间存储方法
原型的this指向实例
继承
原型链
原型与原型层层相连接的过程为原型链
子类的prototype赋值了父级的实例,实现了对父级的继承: SubType.prototype = new SuperType()
子类在创建新的方法或覆盖父类的方法需要在赋值之后
以对象字面量方式创建原型方法会破坏原型链
原型链的问题
使用原型实现继承时,原型实际上变成了另一个类型的实例,意味着原先实例属性摇身一变成为了原型属性(原型中包含的引用值会在所有实例中共享)
子类型在实例化时不能给父类型的构造函数传参
盗用构造函数
在子类函数中调用父类函数,使用call() 或 apply()方法
优点:可以给父类传递参数
问题
必须在构造函数中定义方法,因此函数不能重用
子类不能访问父类原型上定义的方法
组合继承
使用原型链继承原型上的属性和方法,通过盗用构造函数继承实例属性
优点:可以给父类传递参数和继承父类的方法
原型式继承
Object.create(objectName, descriptor)
寄生式继承
创建一个实现继承的函数,以某种方式增强对象,返回这个对象
寄生式组合继承