new 做了什么?
- 創(chuàng)建了一個空對象
- 將空對象的原型指向構(gòu)造函數(shù)的原型
- 將這個空對象改變this的指向去調(diào)用這個構(gòu)造函數(shù)
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的時候辱魁,作為執(zhí)行函數(shù)是返回值undefined,this此時指向的是window
let person = new Person('小唐', 26)
console.log(person) // Person {name: "小糖", age: 26}
當(dāng)使用new操作符后嗡午,打印的person才是對象
模擬一個new
function _new(){
console.log(arguments)
let constructor = Array.prototype.shift.call(arguments)
console.log(constructor) //取出構(gòu)造函數(shù)
console.log(arguments) // 剩下的參數(shù)
let content = {} // 創(chuàng)建一個空對象
content.__proto__ = constructor.prototype // 空對象的原型指向構(gòu)造函數(shù)的原型
constructor.apply(content,arguments) // 將這個空對象改變this的指向去調(diào)用這個構(gòu)造函數(shù)
return content
}
let person2 = _new(Person,'小糖',26)
console.log(person2) //Person {name: "小糖", age: 26}
這時我們打印的person2與person 是一樣的,簡單模擬了new的操作灌具,撒花??~~~~