new 关键字会进行如下的操作:
- 创建一个空对象
- 将空对象的原型,指向构造函数的原型
- 将空对象作为构造函数的上下文【改变this指向】
- 对构造函数有返回值处理判断
function creat(fn, ...args) {
//1.创建一个空的简单JavaScript对象(即{})
let obj = {};
//2.为步骤1新创建的对象添加属性__proto__,将该属性链接至构造函数的原型对象
Object.setPrototypeOf(obj, fn.prototype); //fn.prototype === obj.__proto__
//obj.__proto__ = fn.prototype
//3.将步骤1新创建的对象作为this的上下文
let result = fn.apply(obj, args); //fn构造函数里面的this指向obj
//4.如果该函数没有返回对象,则返回this。
return result instanceof Object ? result : obj;
}
function Fn(name, age) {
this.name = name;
this.age = age;
// return {} //{}
// return 111 // { name: 'fux', age: 22 }
// return null// { name: 'fux', age: 22 }
}