JavaScript的Object.create()

JavaScript有几种方式可以创建对象

1
2
var obj = new Object();
var obj1 = {};

以上的两种方式创建的对象没有什么区别。
但是ES5加了一种新的方式

1
var obj

JavaScript有几种方式可以创建对象

1
2
var obj = new Object();
var obj1 = {};

以上的两种方式创建的对象没有什么区别。
但是ES5加了一种新的方式

1
var obj = Object.create({a: 1});

但是在使用它的时候要很小心。

Object.create()的参数是原型对象,比如传入一个{a:1}。同样,你也可以传入null。

1
var obj = Object.create(null);

传入null意味着创建的这个对象没有继承任何东西,这会导致一些基础方法不可用比如toString()等等。

而且instanceof也会返回不正确的结果。

1
2
3
var obj = Object.create(null);
console.log(typeof obj);//object
console.log(obj instanceof Object);//false

你一定会觉得很奇怪,为什么typeof是object,但是instanceof却返回false
查看js的文档就可以知道,instanceof比较的是

1
Object.getPrototypeOf(obj) === Object.prototype

这个时候用以下代码测试

1
2
3
var obj = Object.create(null);
console.log(Object.getPrototypeOf(obj));//null
console.log(Object.prototype);//Object{...}

这下就很清楚了,使用instanceof时,系统会比较他们的原型,使用Object.create(null)的对象没有继承任何原型,所以是null,所以跟Object的原型完全不同,所以即使typeof返回的是object,但是instanceof也会返回false。

如果想要使用Object.create()创建正常的对象该怎么做呢?其实很简单

1
var obj = Object.create(Object.prototype);

这样做会和{}和new Object()的效果一模一样,但是这个这么长,估计也没人这么用吧。