JS原型鏈和訪問對象原型的方法

大家好淳蔼,我是IT修真院深圳分院第01期學(xué)員坷襟,一枚正直純潔善良的web程序員乡范。

今天給大家分享一下配名,修真院官網(wǎng)JS(職業(yè))任務(wù)4,深度思考中的知識點——JS原型鏈和訪問對象原型的方法

1.介紹

JavaScript 中晋辆,萬物皆對象渠脉。JavaScript根據(jù)"原型鏈"(prototype chain)模式,來實現(xiàn)繼承瓶佳。

2.涉及

2.1對象

JavaScript中芋膘,對象是有區(qū)別的,分為普通對象和函數(shù)對象霸饲,Object 为朋,F(xiàn)unction 是JS自帶的函數(shù)對象,function定義方式本質(zhì)上還是new Function方式厚脉。

function? f1(){};

var?f2?=?function(){};

var?f3?=?new?Function('str','console.log(str)');

var o3 = new f1();

var?o1?=?{};

var?o2?=new?Object();

console.log(typeof? Object); ?//function

console.log(typeof? Function); ?//function

console.log(typeof?o1);???//object

console.log(typeof?o2);???//object

console.log(typeof?o3);???//object

console.log(typeof? f1);???//function

console.log(typeof? f2);???//function

console.log(typeof ?f3);???//function

2.2對象繼承

Brendan Eich參考C++和Java习寸,做了簡化設(shè)計,將new命令引入JavaScript中傻工,new后面跟對象的構(gòu)造函數(shù)融涣,用來創(chuàng)建對象童番。這樣做有個缺點:無法共享方法和屬性。

比如威鹿,在DOG對象的構(gòu)造函數(shù)中剃斧,設(shè)置一個實例對象的共有屬性species。

function DOG(name){

this.name = name;

this.species = '犬科';

}

然后忽你,生成兩個實例對象:

var dogA = new DOG('大毛');

var dogB = new DOG('二毛');

這兩個對象的species屬性是獨立的幼东,修改其中一個,不會影響到另一個科雳。

dogA.species = '貓科';

alert(dogB.species); // 顯示"犬科"根蟹,不受dogA的影響

每一個實例對象,都有自己的屬性和方法的副本糟秘。這不僅無法做到數(shù)據(jù)共享简逮,也是極大的資源浪費。

Brendan Eich決定為構(gòu)造函數(shù)設(shè)置一個prototype屬性尿赚。這個屬性包含一個對象散庶,所有實例對象需要共享的屬性和方法,都放在這個對象里面凌净;那些不需要共享的屬性和方法悲龟,就放在構(gòu)造函數(shù)里面。實例對象一旦創(chuàng)建冰寻,將自動引用prototype對象的屬性和方法须教。也就是說,實例對象的屬性和方法斩芭,分成兩種轻腺,一種是本地的,另一種是引用的划乖。

function DOG(name){

this.name = name;

}

DOG.prototype = { species : '犬科' };

var dogA = new DOG('大毛');

var dogB = new DOG('二毛');

alert(dogA.species); // 犬科

alert(dogB.species); // 犬科

species屬性放在prototype對象里贬养,是兩個實例對象共享的。只要修改了prototype對象迁筛,就會同時影響到兩個實例對象煤蚌。

DOG.prototype.species = '貓科';

alert(dogA.species); // 貓科

alert(dogB.species); // 貓科

由于所有的實例對象共享同一個prototype對象,那么從外界看起來细卧,prototype對象就好像是實例對象的原型尉桩,而實例對象則好像"繼承"了prototype對象一樣。

2.3原型prototype

在JavaScript 中贪庙,每當(dāng)定義一個對象(函數(shù))時候蜘犁,對象中都會包含一些預(yù)定義的屬性。其中函數(shù)對象的一個屬性就是原型對象 prototype止邮。普通對象沒有prototype,但有__proto__屬性这橙。

示例:

function? f1(){};

console.log(f1. prototype) //f1 {}

console.log(typeof ?f1. prototype) //object

console.log(typeof ?Function. prototype) // function

console.log(typeof ?Object. prototype) // object

console.log(typeof ?Function. prototype. prototype) //undefined

2.4 原型鏈

JS在創(chuàng)建對象(不論是普通對象還是函數(shù)對象)的時候奏窑,都有一個叫做__proto__的內(nèi)置屬性,用于指向創(chuàng)建它的函數(shù)對象的原型對象prototype屈扎。

var person = function(name){

this.name = name

};

person.prototype.getName = function(){

return this.name;

}

var zjh = new person(‘zhangjiahao’);

zjh.getName(); //zhangjiahao

以上面的例子為例:

console.log(zjh.__proto__ === person.prototype) //true

同樣埃唯,person.prototype對象也有__proto__屬性,它指向創(chuàng)建它的函數(shù)對象(Object)的prototype

console.log(person.prototype.__proto__ === Object.prototype) //true

繼續(xù)鹰晨,Object.prototype對象也有__proto__屬性墨叛,但它比較特殊,為null

console.log(Object.prototype.__proto__) //null

我們把這個有__proto__串起來的直到Object.prototype.__proto__為null的鏈叫做原型鏈模蜡。

2.5 constructor屬性

prototype對象有一個constructor屬性漠趁,默認指向prototype對象所在的構(gòu)造函數(shù)。

由于constructor屬性定義在prototype對象上面忍疾,意味著可以被所有實例對象繼承闯传。

constructor屬性的作用,是分辨原型對象到底屬于哪個構(gòu)造函數(shù)卤妒。

2.6 總結(jié)

1.原型和原型鏈?zhǔn)荍S實現(xiàn)繼承的一種模型甥绿。

2.原型鏈的形成是真正是靠__proto__ 而非prototype。

3.常見問題

訪問對象原型的方法有哪些荚孵?

4.解決方法

獲取實例對象obj的原型對象妹窖,有三種方法:

1. obj.__proto__

2. obj.constructor.prototype

3. Object.getPrototypeOf(obj)

上面三種方法之中纬朝,前兩種都不是很可靠收叶。最新的ES6標(biāo)準(zhǔn)規(guī)定,__proto__屬性只有瀏覽器才需要部署共苛,其他環(huán)境可以不部署判没。而obj.constructor.prototype在手動改變原型對象時,可能會失效隅茎。

5.編碼實戰(zhàn)

6.擴展思考

1.Object.__proto__ === Function.prototype // true

2.Function.__proto__ === Function.prototype // true

3.Function.prototype.__proto__ === Object.prototype //true

1.Object是函數(shù)對象澄峰,是通過new Function()創(chuàng)建,所以O(shè)bject.__proto__指向Function.prototype辟犀。

2.Function 也是對象函數(shù)俏竞,也是通過new Function()創(chuàng)建,所以Function.__proto__指向Function.prototype堂竟。

3.Function.prototype是個函數(shù)對象魂毁,理論上其__proto__應(yīng)該指向 Function.prototype,就是它自己出嘹,自己指向自己席楚,沒有意義。函數(shù)對象也是對象税稼,給它設(shè)定根指向Object.prototype烦秩,Object.prototype.__proto__ === null垮斯,保證原型鏈能夠正常結(jié)束。

7.參考文獻

參考一:阮一峰:Javascript繼承機制的設(shè)計思想

參考二:zhangjiahao8961:JavaScript原型及原型鏈詳解

8.更多討論

JavaScript 對象的繼承機制

鳴謝

感謝大家觀看

PPT鏈接

視頻鏈接


JS原型對象和原型鏈簡介_騰訊視頻

------------------------------------------------------------------------------------------------------------------------

今天的分享就到這里啦只祠,歡迎大家點贊兜蠕、轉(zhuǎn)發(fā)、留言抛寝、拍磚~

下期預(yù)告:簡述JS面向?qū)ο缶幊涛保灰姴簧

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市墩剖,隨后出現(xiàn)的幾起案子猴凹,更是在濱河造成了極大的恐慌,老刑警劉巖岭皂,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件郊霎,死亡現(xiàn)場離奇詭異,居然都是意外死亡爷绘,警方通過查閱死者的電腦和手機书劝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來土至,“玉大人购对,你說我怎么就攤上這事√找颍” “怎么了骡苞?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長楷扬。 經(jīng)常有香客問我解幽,道長,這世上最難降的妖魔是什么烘苹? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任躲株,我火速辦了婚禮,結(jié)果婚禮上镣衡,老公的妹妹穿的比我還像新娘霜定。我一直安慰自己,他們只是感情好廊鸥,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布望浩。 她就那樣靜靜地躺著,像睡著了一般黍图。 火紅的嫁衣襯著肌膚如雪曾雕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天助被,我揣著相機與錄音剖张,去河邊找鬼切诀。 笑死,一個胖子當(dāng)著我的面吹牛搔弄,可吹牛的內(nèi)容都是我干的幅虑。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼顾犹,長吁一口氣:“原來是場噩夢啊……” “哼倒庵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起炫刷,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤擎宝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后浑玛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绍申,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年顾彰,在試婚紗的時候發(fā)現(xiàn)自己被綠了极阅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡涨享,死狀恐怖筋搏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情厕隧,我是刑警寧澤奔脐,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站栏账,受9級特大地震影響帖族,放射性物質(zhì)發(fā)生泄漏栈源。R本人自食惡果不足惜挡爵,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望甚垦。 院中可真熱鬧茶鹃,春花似錦、人聲如沸艰亮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迄埃。三九已至疗韵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侄非,已是汗流浹背蕉汪。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工流译, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人者疤。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓福澡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親驹马。 傳聞我的和親對象是個殘疾皇子革砸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345

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

  • 聲明:此文為轉(zhuǎn)載文章,為了自己看起來方便特此重新排版糯累,等日后看懂了再自己整理疏解算利,查看原文請點擊這里。 正文: J...
    辭鏡朱顏閱讀 533評論 0 1
  • 一. 普通對象與函數(shù)對象JavaScript 中泳姐,萬物皆對象笔时!但對象也是有區(qū)別的。分為普通對象和函數(shù)對象仗岸,Obje...
    80bb3ef13dea閱讀 1,593評論 1 10
  • 一. 普通對象與函數(shù)對象 JavaScript 中允耿,萬物皆對象!但對象也是有區(qū)別的扒怖。分為普通對象和函數(shù)對象较锡,Obj...
    抓住時間的尾巴吧閱讀 309評論 0 0
  • 在JavaScript中,原型鏈作為一個基礎(chǔ)盗痒,老生長談蚂蕴,今天我們就來深入的解讀一下原型鏈。 本章主要講的是下面幾點...
    Devinnn閱讀 1,398評論 1 6
  • 【JS-05】原型鏈和訪問對象原型的方法 小課堂【武漢第170期】 分享人:莊引 目錄 1.背景介紹 2.知識剖析...
    莊引之閱讀 418評論 1 3