Object.create(null) 和 {} 的区别
字面量和new
关键字创建的对象是Object
的实例,原型指向Object.prototype
,继承内置对象Object
Object.create(arg, pro)
创建的对象的原型取决于arg
,arg
为null
,新对象是空对象,没有原型,不继承任何对象;arg
为指定对象,新对象的原型指向指定对象,继承指定对象
在Vue和Vuex的源码中,作者都使用了Object.create(null)
来初始化一个新对象。为什么不用更简洁的{}
呢?
在SegmentFault
和Stack Overflow
等开发者社区中也有很多人展开了讨论,在这里总结成文,温故知新。
使用create
创建的对象,没有任何属性,显示No properties
,我们可以把它当作一个非常纯净的map来使用,我们可以自己定义hasOwnProperty
、toString
方法,不管是有意还是不小心,我们完全不必担心会将原型链上的同名方法覆盖掉。
另一个使用create(null)
的理由是,在我们使用for..in
循环的时候会遍历对象原型链上的属性,使用create(null)
就不必再对属性进行检查了,当然,我们也可以直接使用Object.keys[]
。
参考链接
https://juejin.cn/post/6844903917835436045