原型對象:
每創(chuàng)建一個(gè)函數(shù)晕翠,該函數(shù)就會自動帶有一個(gè) prototype 屬性。該屬性是個(gè)指針持痰,指向了一個(gè)對象铐懊,我們稱之為 原型對象邀桑。什么是指針?指針就好比學(xué)生的學(xué)號科乎,原型對象則是那個(gè)學(xué)生壁畸。我們通過學(xué)號找到唯一的那個(gè)學(xué)生。假設(shè)突然,指針設(shè)置 null, 學(xué)號重置空了捏萍,不要慌太抓,對象還存在,學(xué)生也沒消失令杈。只是不好找了走敌。
原型對象上默認(rèn)有一個(gè)屬性 constructor,該屬性也是一個(gè)指針逗噩,指向其相關(guān)聯(lián)的構(gòu)造函數(shù)掉丽。
為什么要使用原型對象
function Person(name, age) {
this.name = name
this.age = age
this.eat = function () {
console.log("吃飯")
}
}
var per1 = new Person("小明", 18)
var per2 = new Person("小紅", 20)
console.log(per1 === per2) //false
per1.eat() //吃飯
per2.eat() //吃飯
console.log(per1.eat === per2.eat) //false
自定義構(gòu)造函數(shù)每次實(shí)例化出來的對象,構(gòu)造函數(shù)都會創(chuàng)建一次,
所以eat方法在內(nèi)存中創(chuàng)建了兩次!他們在內(nèi)存中的地址不同,所以不等!
但是因?yàn)樗鼈兊倪壿嫼凸δ芤粯?這樣就導(dǎo)致了代碼冗余,影響性能,所以這里就需要用到原型對象!
使用原型對象來寫后
function Person(name, age) {
this.name = name
this.age = age
}
Person.prototype.eat = function () { //將eat方法添加到Person的原型中
console.log("恰飯")
}
var per1 = new Person("小明", 18)
var per2 = new Person("小紅", 20)
console.log(per1 === per2) //false
console.log(per1.eat === per2.eat) //true
per1.eat() //恰飯
per2.eat() //恰飯
由此可以看出原型對象,創(chuàng)建了一個(gè)共用的對象给赞,來處理共享數(shù)據(jù)机打。
prototype是JS中常令人迷惑的一個(gè)概念,之所以令人迷惑是因?yàn)榇蠹铱偸窍氚阉c面向?qū)ο蟮慕?jīng)典框架結(jié)合起來片迅,反而束縛了自己的思維残邀。JS是一個(gè)純粹的面向?qū)ο笙到y(tǒng),使用構(gòu)造函數(shù)的prototype實(shí)現(xiàn)了對象屬性間的共享柑蛇,本文探索了prototype的本質(zhì)并歸納總結(jié)了prototype的使用規(guī)則芥挣。