对象字面量 和 Objct 构造函数
对象字面量的方式是我们日常开发中最常用的创建对象的方式;
直接使用对象字面量的方式更加简洁高效,仅是一个可变的哈希映射,而不是从对象中提取属性和方法;
相比较Object构造函数而言,对象字面量方式不需要进行作用域解析。Object构造函数方式需要从调用Object()的位置开始,沿着作用域链向上查找,直到找到全局变量Object构造函数。
Object.create
Object.create 可以以现有的对象来提供新创建的对象的__proto__,甚至通过使用null创建没有prototype的对象
类式继承
Child.prototype = new Parent();
- 子类通过原型prototype对父类实例化继承了父类,如果父类中的共有属性是引用类型,就会在子类中被所有实例公用;
- 由于子类是通过prototype的方式来对父类实例化实现的,所以在创建父类时,是没法向父类中传递参数的。
构造函数式继承
Child () {
Parent.call(this, arguments);
}
在子类中通过调用父类,并改变父类的this指向,来实现子类继承父类中的所有共有属性,但是没有涉及到prototype,所以子类没法继承父类的原型方法
组合继承
Child () {
Parent.call(this, arguments);
}
Child.prototype = new Parent();
组合式继承是类式继承和构造函数式继承的组合体,既继承了父类中的共有属性,又继承了父类的原型方法;美中不足的是,父类构造函数执行了两遍。
原型式继承
function inherit (o) {
function Child () {}
Child.prototype = o;
return new Child();
}
这种原型式继承看着跟Object.create方式相似,Object.create内部确实使用了原型式继承的方式。
寄生式继承
function create (obj) {
const o = inherit(obj);
o.getValue = function() {}
return o;
}
寄生式继承相对于原型式继承的优势在于,可以对继承的对象进行扩展。
寄生组合式继承
function inheritPrototype (Child, Parent) {
const p = inherit(Parent.prototype);
p.constructor = Child;
Child.prototype = p;
}
寄生式组合继承是寄生式继承和构造函数式继承的组合;其中p相当于Child的原型想法,以inherit中的Child为过渡函数,搭建起Child和Parent的继承关系。