Prototype

?bp[ 原型最重要的是為了share(共享), 共享一些方法和屬性琳轿。


原型Prototype

JavaScript 是一門基于原型的語言,每個對象都有一個原型(對象)作為模板挪哄。
通過原型這種機(jī)制迹炼,對象能從其他對象繼承功能特性;這種繼承機(jī)制與經(jīng)典的面向?qū)ο缶幊陶Z言不同砂碉。

__proto__

每一個對象都有一個__proto__屬性用于繼承功能特效增蹭,該屬性不是標(biāo)準(zhǔn)的一部分磅摹,但卻是事實(shí)標(biāo)準(zhǔn)

聲明對象 fan 如下饼灿, 當(dāng)訪問name帝美,traval()等自身具有的屬性/方法時悼潭,會從對象自身獲取
當(dāng)訪問漆枚,valueOf(), toString(),等非自身屬性/方法時抵知,會從(也只能)__proto__屬性上獲取

let fan = {
name:'女粉絲',
gender:'女',
height:162,
eat(){ return `吃飯残制。`},
sleep(){return `睡覺`},
intro() {return `大家好掖疮!我是${this.name}。`},
travel() {return'環(huán)游世界 ??????'}
}

>fan.name
→"呂粉絲"
>fan.travel()
→"環(huán)游世界 ??????"
>fan.valueOf()
→Object{name:"呂粉絲", height:162, gender:"女",eat:function,sleep:function…}


Object.prototype

以下代碼都描述了 一個事實(shí)恼布, Object,prototype (引用的對象) 是fan 的原型折汞。

>fan.__proto__===Object.prototype//fan.__proto__ 和 Object.prototype 引用同一對象
→true
>Object.prototype.isPrototypeOf(fan)//Object.prototype(引用的對象) 是 fan 的原型
→true
>Object.prototype===Object.getPrototypeOf(fan)
→true


Object.create()

Object.create() ES5 ?方法允許使用指定的原型對象和屬性爽待,創(chuàng)建一個新的屬性

//常人的屬性和方法//常人的原型
const personProto? = {
name:' ',
eat() {return'吃飯 ??'},
sleep() {return'睡覺 ??'},
sing() {return'唱歌 ??'},
intro() {return`大家好!我是${this.name}膏燃。`}
}

//讓 personProto 作為 fan 的原型

let fan= Object.create(personProto)
fan.name='呂粉絲'
fan.height=162
fan.gender='女'
fan.travel=function() {return'環(huán)游世界 ??????'}

顯然组哩,以下表達(dá)式都會返回true富俄。

fan.__proto__ === personProto
true
personProto.isprototype(fan)
true
personProto === Object.getPrototypeOf(fan)

true


通過Object.keys()獲取fan的所有屬性名。

>Object.keys(fan)
→ ["name","height","gender","travel"]

Object.prototype.hasOwnProperty()
Object.prototype.hasOwnProperty()方法是用于判定某個指定的屬性是否對象的自身(非繼承)屬性。

>for(letkeyinfan)console.log(key, fan[key])?
name 呂粉絲?
height162
gender 女?
travel? function() {return'環(huán)游世界 ??????'}?
eat? functioneat() {return'吃飯 ??'}?
sleep? functionsleep() {return'睡覺 ??'}?
sing? functionsing() {return'唱歌 ??'}?
intro? functionintro() {return`大家好悠瞬!我是${this.name}涯捻。`}
→undefined

由于for...in會把繼承的屬性和方法都進(jìn)行遍歷障癌,因此需要Object.prototype.hasOwnProperty()。

>for(letkeyinfan)fan.hasOwnProperty(key)&&console.log(key, fan[key])?
name 呂粉絲?
height 162
gender 女?
travel? function() {return'環(huán)游世界 ??????'}
→false


原型鏈 Prototype Chiin

原型本身就是一個對象康辑,因此也有__proto__屬性疮薇。即原型的原型我注。還有原型的原型的原型等。這就是原型鏈励七。
Object.prototype.__proto__的值是null,而null 沒有原型,到此就是原型鏈末端补履。

//創(chuàng)建藝人的原型
const? artistProto=Object.create(personProto)
artistProto.sing=function() {return '唱歌 11??????'}

//讓 artistProto 作為 jay 的原型
let? jay=Object.create(artistProto)
jay.name='周杰倫'
jay.height=175
jay.gender='男'
jay.aiyo=function() {return'哎喲箫锤,不錯哦雨女!'}


//讓 artistProto 作為 kris 的原型
let kris=Object.create(artistProto)
kris.name='吳亦凡'
kris.height=187
kris.intro=function() {return`歌手${this.name}。其實(shí)我是一個演員馏臭。`}
kris['有 freestyle 嗎括儒?']=function() {return['有 freestyle 嗎?','還有 freestyle 嗎帮寻?','有沒有 freestyle固逗?'][Math.floor(Math.random()*3)]};

以下代碼中jay.intro()和kris.intro()的intro()方法分別來自哪里藕帜?

在對象創(chuàng)建之后往其原型新增屬性/方法于樟,對象可以立即訪問到笆凌。

>jay.sing()
→"唱歌 ??????"
>artistProto.film=function() {return'拍戲 ??????'}
→function() {return'拍戲 ??????'}
>jay.film()
→"拍戲 ??????"


instanceof? 運(yùn)算符用來測試一個對象在其原型鏈中是否存在一個構(gòu)造函數(shù)的prototype 屬性隘弊。

var a = [1,2,3]
a instanceof Object? ?//? 意思是 a 的原型鏈上有沒有Object.prototype
true?

a.constructor
function Array([native code])
a.__proto__ === a.constructor.prototype? //?a.constructor. prototype??=== Array.prototype
true

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末长捧,一起剝皮案震驚了整個濱河市串结,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卧蜓,老刑警劉巖把敞,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盛霎,死亡現(xiàn)場離奇詭異耽装,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)规个,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門诞仓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來墅拭,“玉大人帜矾,你說我怎么就攤上這事屑柔〉穑” “怎么了招拙?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵别凤,是天一觀的道長规哪。 經(jīng)常有香客問我,道長蝠嘉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任努酸,我火速辦了婚禮获诈,結(jié)果婚禮上舔涎,老公的妹妹穿的比我還像新娘终抽。我一直安慰自己桶至,他們只是感情好镣屹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布持舆。 她就那樣靜靜地躺著伪窖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪竹伸。 梳的紋絲不亂的頭發(fā)上勋篓,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天譬嚣,我揣著相機(jī)與錄音钞它,去河邊找鬼殊鞭。 笑死钱豁,一個胖子當(dāng)著我的面吹牛疯汁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谤碳,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼蜒简,長吁一口氣:“原來是場噩夢啊……” “哼漩仙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起卷仑,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎垢啼,沒想到半個月后芭析,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體馁启,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年进统,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浪听。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡螟碎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出迹栓,到底是詐尸還是另有隱情掉分,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站酥郭,受9級特大地震影響华坦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜不从,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一惜姐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧椿息,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至坯钦,卻和暖如春序仙,著一層夾襖步出監(jiān)牢的瞬間律秃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工柜裸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怜浅,地道東北人锦爵。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓樟氢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親碴开。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容