JavaScript中创建对象的方法

172 阅读2分钟

对象字面量 和 Objct 构造函数

对象字面量的方式是我们日常开发中最常用的创建对象的方式;

直接使用对象字面量的方式更加简洁高效,仅是一个可变的哈希映射,而不是从对象中提取属性和方法;

相比较Object构造函数而言,对象字面量方式不需要进行作用域解析。Object构造函数方式需要从调用Object()的位置开始,沿着作用域链向上查找,直到找到全局变量Object构造函数。

Object.create

Object.create 可以以现有的对象来提供新创建的对象的__proto__,甚至通过使用null创建没有prototype的对象

类式继承

Child.prototype = new Parent();
  1. 子类通过原型prototype对父类实例化继承了父类,如果父类中的共有属性是引用类型,就会在子类中被所有实例公用;
  2. 由于子类是通过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的继承关系。