new的时候
1.创建一个空对象
2.将空对象的原型 指向于构造函数的原型
3.将空对象作为构造函数的上下文(改变this的指向)
4.对构造函数有返回值的处理判断
//返回值是基本类型
function fnObj() {
this.name = '张三'
return 11111111
}
console.log(new fnObj());
结果:
//返回值 是 引用类型
function FnObj(age) {
this.age = age
return {}
}
console.log(FnObj(12));
结果:
因此,我们可以得出结论:
New里面可以对 构造函数 的return 返回值 进行判断
如果 return的是基本类型 则 这个返回值 就会被忽略
当然 如果 返回的 是引用类型 这个new 就没用了
根据这个 我们可以自己封装一个 new的功能
function Fun(age, name) {
this.age = age
this.name = name
return 222
}
//从new的使用我们可以知道
//new的第一个参数 就是一个函数 第二个参数 是 new的时候传进去的参数
function create(fn, ...args) {
//1.创建一个空对象
var obj = {} //var obj =Object.create({})
//2.将空对象的原型 指向于构造函数的原型
Object.setPrototypeOf(obj, fn.prototype)
//3.将空对象作为构造函数的上下文(改变this的指向)
var result = fn.apply(obj, args);
//4.对构造函数有返回值的处理判断
return result instanceof Object ? result : obj
}
console.log(create(Fun, 18, '张三'));
结果: