首先看一下下面的代碼
function User(name , age, career) {
this.name = name
this.age = age
this.career = career
}
const user = new User('ryan', 19, 'fe')
console.log(user) // {name: "ryan", age: 19, career: "fe"}
function newUser(name , age, career) {
return {
name,
age,
career ,
}
}
const newuser = newUser('ryan', 19, 'fe')
console.log(newuser) // {name: "ryan", age: 19, career: "fe"}
想想這兩種獲取對(duì)象的方式有什么不同?
再看看下面的代碼
function User(name , age, career) {
this.name = name
this.age = age
this.career = career
}
User.prototype.sayName = function () {
console.log("Hello")
}
const user = new User('ryan', 19, 'fe')
console.log(user) // {name: "ryan", age: 19, career: "fe"}
user.sayName() // Hello
function newUser(name , age, career) {
return {
name,
age,
career ,
}
}
newUser.prototype.sayName = function () {
console.log("Hello")
}
const newuser = newUser('ryan', 19, 'fe')
console.log(newuser) // {name: "ryan", age: 19, career: "fe"}
newuser.sayName() // Uncaught TypeError: newuser.sayName is not a function
看到這里是不是感覺(jué)好像明白了什么
new 的過(guò)程和普通的函數(shù)返回不同,new 其實(shí)是一種繼承的方式, 通過(guò)new,實(shí)例與構(gòu)造函數(shù)通過(guò)原型鏈連接了起來(lái)出來(lái),所以實(shí)例能訪問(wèn)到構(gòu)造函數(shù)的屬性,具體過(guò)程如下
- 開(kāi)辟一個(gè)塊內(nèi)存,創(chuàng)建一個(gè)空對(duì)象
- 執(zhí)行構(gòu)造函數(shù),對(duì)這個(gè)空對(duì)象進(jìn)行構(gòu)造
- 給這個(gè)空對(duì)象添加proto屬性
__proto__ = User.prototype