Appearance
new操作符做了什么
可直接参考MDN的定义 new运算符
- 创建空对象
- 将空对象的原型指向构造函数的原型
- 将空对象作为构造函数的上下文(改变this指向)
- 构造函数有返回值,需判断并按条件返回(基本类型忽略,引用类型相当于没有new)
分步验证
javascript
// 1、创建空对象
function newFunc(){}
console.log(new newFunc())
// 2、将空对象的原型指向构造函数的原型
console.log(newFunc.prototype == new newFunc().__proto__)
// 3、将空对象作为构造函数的上下文(改变this指向)
function newFunc2(){
console.log(this)
}
console.log(newFunc2())
console.log(new newFunc2())
// 4、对构造函数有返回值,需判断并按条件返回
function newFunc3(){
return 1111
}
console.log(new newFunc3())
function newFunc4(){
return [1,2,3]
}
console.log(new newFunc4())
function newFunc5(){
return {"name": "tom", "age": 18}
}
console.log(new newFunc5())自制new操作
javascript
function myNew( fn, ...args ){
var obj = {}; // var obj = Object.create({})
Object.setPrototypeOf(obj, fn.prototype);
var result = fn.apply(obj, args);
return result instanceof Object ? result : obj;
}