深入理解 Object.create

Author Avatar
Klein 3月 15, 2019

语法

1
2
> Object.create(proto, [propertiesObject])
>
  • 参数:

    proto 新创建对象的原型对象。

    propertiesObject 可选。如果没有指定为 undefined,则是要添加到新创建对象的可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)对象的属性描述符以及相应的属性名称。这些属性对应 Object.defineProperties() 的第二个参数。

  • 返回值:

    一个新对象,带着指定的原型对象和属性。

本质

我在复习继承的时候,发现寄生组合式继承和阮一峰老师的利用空对象作为中介的继承方式十分相似,简直是一模一样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

// 寄生组合式继承
function inheritPrototype(subType, superType){
var prototype = Object.create(superType.prototype); // 创建对象,创建父类原型的一个副本
prototype.constructor = subType; // 增强对象,弥补因重写原型而失去的默认的constructor 属性
subType.prototype = prototype; // 指定对象,将新创建的对象赋值给子类的原型
}

// 利用空对象作为中介
function extend(Child, Parent) {
var F = function(){};
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.prototype.constructor = Child;
Child.uber = Parent.prototype;
}

不难发现,他们都是用一个以父类的原型为原型的对象作为子类的原型。

去查了一下 Object.create 的 Polyfill,果不其然:

Polyfill最核心的部分:

1
2
3
4
5

function F() {}
F.prototype = proto;

return new F();

Object.create 方法的实质是新建一个空的构造函数F,然后让F.prototype属性指向参数对象obj,最后返回一个F的实例,从而实现让该实例继承obj的属性。

参考

Object.create() - JavaScript | MDN
一个新对象,带着指定的原型对象和属性