关键字 new 在调用构造函数的时候实际上进行了如下的几个步骤
- 创建一个新的对象
- 将构造函数的作用域赋值给这个新的对象(因此 this 指向了这个新的对象)
- 执行构造函数中的代码(为这个新对象添加属性)
- 返回新对象
模拟 new 的效果
1 2 3 4 5 6 7 8
| function Person() { }
var student = new Person();
var student = objectFactory(Person );
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| function objectFactory() { const obj = {}; const Constructor = [].shift.call(arguments); obj.__proto__ = Constructor.prototype; Constructor.apply(obj, arguments); return obj; }
|
如果构造函数中返回了一个对象,则在实例中只能访问到返回的对象中的属性。
所以我们还需要判断返回的值是不是一个对象,如果是一个对象,我们就返回这个对象,如果没有,我们该返回什么就返回什么。
1 2 3 4 5 6 7
| function objectFactory() { const obj = {}; const Constructor = [].shift.call(arguments); obj.__proto__ = Constructor.prototype; const res = Constructor.apply(obj, arguments); return typeof res === "object" ? res : obj; }
|