- 创建了一个空的对象
- 将空对象的原型指向于构造函数的原型
- 将空对象作为构造函数的上下文(改变this指向)
- 对构造函数有返回值的处理判断
验证一
创建了一个空对象
function Foo(){}
let obj = new Foo()
console.log(typeof obj) // object
console.log(obj) // Foo {}
验证二
将空对象的原型指向了构造函数的原型
function Foo(){}
let obj = new Foo()
console.log(obj.__proto__ === Foo.prototype) // true
验证三
改变this指向
function Foo(){
console.log(this)
}
Foo() // window
console.log(new Foo()) // Foo {}
验证四
返回值处理判断
内部判断如果构造函数内部返回值是基本类型,那么不返回,如果返回值是引用类型,则会返回引用类型
function Foo(){
return 111
}
console.log(new Foo()) // Foo {}
function Fn(){
return {a: 11}
}
console.log(new Fn()) // {a: 11}
封装一个能完成new功能的函数
function Fun(age){
this.age = age
}
console.log(new Fun(18)); // Fun { age: 18 }
function Fun(age, name){
this.age = age
this.name = name
}
// 第一个参数是函数,第二个参数是数组,里面放着剩下的参数
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, '张三')); // Fun { age: 18, name: '张三' }