Object.create()
Object.create()的定义Object.create(proto,[propertiesObject])
proto:新创建对象的原型对象
propertiesObject:可选。要添加到新对象的可枚举(新添加的属性是其自身的属性,而不是其原型链上的属性)的属性
Object.create()方法创建一个新对象,并使用现有的对象来提供新创建的对象的proto.
1 | Object.create = function (o){ |
可以看到Object.create内部创建了一个新对象(实例),假设叫newObj
,默认情况下newObj.__proto__ == F.prototype
,在本例中侧重重写了构造函数F
的原型属性,最终的原型关系链newObj.__proto__ == F.prototupe == o
.
Object.create(null)的使用场景
为什么很多源码作者会使用Object.create(null)来初始化一个新对象呢?这是作者的习惯,还是一个最佳实践?
使用create
创建的对象,没有任何属性,显示No properties
,我们可以把它当作一个非常纯净的map
来使用,我们可以自己定义hasOwnProperty、toString
方法,不管是有意还是不小心,我们完全不必担心会将原型链上的同名方法覆盖掉.
另一个使用create(null)
的理由是,在我们使用for..in
循环的时候会遍历对象原型链上的属性,使用create(null)
就不必再对属性进行检查了,当然,我们也可以直接使用Object.keys[]
。
总结一下:
你需要一个非常干净且高度可定制的对象当作数据字典的时候;
想节省hasOwnProperty带来的一丢丢性能损失并且可以偷懒少些一点代码的时候
用Object.create(null)吧!
其他时候,请用{}。