new实例化
- 返回一个新的对象
- 新对象可以访问构造函数里的属性和方法
- 新对象可以访问 prototype 上的属性和方法
初步实现
因为 new 是关键字,所以无法像 bind 函数一样直接覆盖,所以我们写一个函数,命名为 mockNew,来模拟 new 的效果。
1 2 3 4 5 6 7 8 9 10 11 12
| function mockNew() { var obj = new Object(); var Constructor = [].shift.call(arguments); obj.__proto__ = Constructor.prototype; Constructor.apply(obj, arguments); return obj; }
|
兼容返回值类型
我们还需要判断构造函数的返回值,如果构造函数的返回值是一个引用类型的对象,我们就返回构造函数的返回值,如果不是,我们该返回什么就返回什么。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| function mockNew() { var obj = new Object(); var Constructor = [].shift.call(arguments); obj.__proto__ = Constructor.prototype; var result = Constructor.apply(obj, arguments); return result instanceof Object ? result : obj; }
|
参考
https://github.com/mqyqingfeng/Blog/issues/13