- 创建一个空的新对象;
- 将构造函数的作用域赋给新对象(因此this就指向了这个新对象);
- 执行构造函数中的代码(为这个新对象添加属性);
- 如果这个函数有返回值,则返回;否则就默认返回新对象
第一步
创建一个新的空对象
function myNew() {
let obj = {};
}
第二步
将构造函数的作用域赋给新对象,给这个新对象构造原型链,链接到构造函数的原型对象上,从而新对象就可以访问构造函数中的属性和方法。
let constructor = [].prototype.shift.call(arguments);
第三步
把obj的原型指向构造函数的原型对象上。
obj.__proto__ = constructor.prototype;
第四步
绑定this值
var result = constr.apply(obj, arguments);
第五步
返回新对象
如果构造函数有返回值,则返回;否则,就会默认返回新对象。
因为new关键字如果返回的是null,undefined以及基本类型的时候,都会返回新的对象,只有返回对象的时候,才会返回构造函数的返回值。
所以,要判断result是不是object类型,如果是object类型,那么就返回result,否则返回obj。
return result instanceof Object? result : obj;
完整步骤:
function create(){
// 1. 创建一个空对象
let obj = {};
// 2. 获取构造函数
let constructor = [].shift.call(arguments);
// 3. 链接到原型
obj.__proto__ = constructor.prototype;
// 4. 绑定this值
let result = constructor.apply(obj, arguments);
// 5. 返回新对象
return result instanceof Object? result : obj;
}