首先看一下下面的代碼
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"}
想想這兩種獲取對象的方式有什么不同?
再看看下面的代碼
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
看到這里是不是感覺好像明白了什么
new 的過程和普通的函數(shù)返回不同,new 其實是一種繼承的方式, 通過new,實例與構(gòu)造函數(shù)通過原型鏈連接了起來出來,所以實例能訪問到構(gòu)造函數(shù)的屬性,具體過程如下
- 開辟一個塊內(nèi)存,創(chuàng)建一個空對象
- 執(zhí)行構(gòu)造函數(shù),對這個空對象進行構(gòu)造
- 給這個空對象添加proto屬性
__proto__ = User.prototype