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) {  |