Object.create(null)与{}的区别
我们通过例子来直观的认识下两者:
1 | let obj = {}; |
- 通过字面量的方式定义对象,其原型指向
Object.prototype
,也就是obj.__proto__ === Object.prototype
,同时包含了toString,hasOwnProperty
等方法- 通过
Object.create(null)
创建出来的对象是一个干净对象,除自身属性之外,没有附加其他属性
使用Object.create(null)的原因
很多框架源码作者使用它来初始化一个新的对象,难道是最佳实践?
- 通过
Object.create(null)
创建出来的对象,没有任何属性,显示No properties
。我们可以将其当成一个干净的map
来使用,自主定义toString,hasOwnProperty
等方法,并且不必担心将原型链上的同名方法被覆盖。 - {…}创建的对象,使用
for in
遍历对象的时候,会遍历原型链上的属性,带来性能上的损耗。使用Object.create(null)
则不必再对其进行遍历了
框架源码对性能的要求,哪怕是一点点,都值得关注
手写Object.create
1 | //create不是在原型上的,直接判断是否有这个方法 |
new func()做了什么
new func()的作用是创建一个新的对象,其中func是一个构造函数,在这个过程中,主要包含了如下步骤:
- 创建空对象obj
- 将obj的原型设置为构造函数的原型
- 将obj为上下文执行构造函数,func.call(obj)
- 返回obj对象
根据上面的过程,我们通过代码来模仿new的实现原理:
因为new是关键字,无法像 bind,call,apply 等函数一样直接覆盖,我们写一个函数,命名为 objectCreator。使用的时候是这样的:
注意:此处new实现只是模拟new func()
–>不带参数
1 | function Person() { |
实现方案如下:
1 | function objectCreator(func) { |