new 做了什么?
- 创建了一个空对象
- 将空对象的原型指向构造函数的原型
- 将这个空对象改变this的指向去调用这个构造函数
function Person(name, age) {
this.name = name
this.age = age
}
let person = Person('小唐', 26)
console.log(person) // undefined
console.log(window.age) // 26
console.log(window.name) // 小糖
我们没有用new的时候,作为执行函数是返回值undefined,this此时指向的是window
let person = new Person('小唐', 26)
console.log(person) // Person {name: "小糖", age: 26}
当使用new操作符后,打印的person才是对象
模拟一个new
function _new(){
console.log(arguments)
let constructor = Array.prototype.shift.call(arguments)
console.log(constructor) //取出构造函数
console.log(arguments) // 剩下的参数
let content = {} // 创建一个空对象
content.__proto__ = constructor.prototype // 空对象的原型指向构造函数的原型
constructor.apply(content,arguments) // 将这个空对象改变this的指向去调用这个构造函数
return content
}
let person2 = _new(Person,'小糖',26)
console.log(person2) //Person {name: "小糖", age: 26}
这时我们打印的person2与person 是一样的,简单模拟了new的操作,撒花~~~~