【js基礎(chǔ)】JavaScript中的面向?qū)ο螅∣OP)

1.對象的概念

首先樹立一個概念:萬物皆對象艇潭。JavaScript 中的所有事物都是對象,包括字符串戏蔑、數(shù)值蹋凝、數(shù)組、函數(shù)等等总棵。

js中的對象分為內(nèi)建對象和自定義對象鳍寂。內(nèi)建對象是指String、Date情龄、Array等js中內(nèi)置定義的對象類型迄汛。除內(nèi)建對象外的其他對象為自定義對象捍壤。

對象,是帶有屬性和方法的特殊數(shù)據(jù)類型鞍爱。

2.面向?qū)ο?/b>

使用對象時鹃觉,只關(guān)注對象提供的功能,不關(guān)注其內(nèi)部細節(jié)硬霍。比如電腦——有鼠標帜慢、鍵盤,我們只需要知道怎么使用鼠標唯卖,敲打鍵盤即可粱玲,不必知道為何點擊鼠標可以選中、敲打鍵盤是如何輸入文字以及屏幕是如何顯示文字的拜轨〕榧酰總之我們沒必要知道其具體工作細節(jié),只需知道如何使用其提供的功能即可橄碾,這就是面向?qū)ο蟆?/p>

JavaScript的面向?qū)ο缶幊毯痛蠖鄶?shù)其他語言如Java卵沉、C#的面向?qū)ο缶幊潭疾惶粯印H绻闶煜ava或C#法牲,很好史汗,你一定明白面向?qū)ο蟮膬蓚€基本概念:

類:類是對象的類型模板,例如拒垃,定義Student類來表示學(xué)生停撞,類本身是一種類型,Student表示學(xué)生類型悼瓮,但不表示任何具體的某個學(xué)生戈毒;

實例:實例是根據(jù)類創(chuàng)建的對象,例如横堡,根據(jù)Student類可以創(chuàng)建出xiaoming埋市、xiaohong、xiaojun等多個實例命贴,每個實例表示一個具體的學(xué)生道宅,他們?nèi)紝儆赟tudent類型。

所以胸蛛,類和實例是大多數(shù)面向?qū)ο缶幊陶Z言的基本概念培己。

不過,在JavaScript中胚泌,這個概念需要改一改。JavaScript不區(qū)分類和實例的概念肃弟,而是通過原型(prototype)來實現(xiàn)面向?qū)ο缶幊嚏枋摇S嘘P(guān)原型的概念和原理下文會提到零蓉。

3.對象的基本構(gòu)成

訪問名稱為ObjectName的對象的屬性:

ObjectName.propertyName

訪問名稱為ObjectName的對象的方法并直接調(diào)用該方法:

ObjectName.methodName()

4.對象的創(chuàng)建

原型是指當我們想要創(chuàng)建xiaoming這個具體的學(xué)生時,我們并沒有一個Student類型可用穷缤。那怎么辦敌蜂?恰好有這么一個現(xiàn)成的對象:

var robot = {? ?

????name:'Robot',

? ? height:1.6,? ?

????run:function(){

????????console.log(this.name +' is running...');? ?

????}

};

我們看這個robot對象有名字,有身高津肛,還會跑章喉,有點像小明,干脆就根據(jù)它來“創(chuàng)建”小明得了身坐!

于是我們把它改名為Student秸脱,然后創(chuàng)建出xiaoming:

var Student = {? ?

????name:'Robot',? ?

????height:1.2,? ?

????run:function()? {

????????console.log(this.name +' is running...');? ?

????}

};

var xiaoming = { name: '小明' };

xiaoming.__proto__ = Student;? //指向原型對象

注意最后一行代碼把xiaoming的原型指向了對象Student,看上去xiaoming仿佛是從Student繼承下來的:

xiaoming.name;? //'小明'

xiaoming.run();? //小明 is running...

xiaoming有自己的name屬性部蛇,但并沒有定義run()方法摊唇。不過,由于小明是從Student繼承而來涯鲁,只要Student有run()方法巷查,xiaoming也可以調(diào)用。

JavaScript的原型鏈和Java的Class區(qū)別就在于它沒有“Class”的概念抹腿,所有對象都是實例岛请,所謂繼承關(guān)系不過是把一個對象的原型指向另一個對象而已


(1) 創(chuàng)建對象的原理

JavaScript對每個創(chuàng)建的對象都會設(shè)置一個原型警绩,指向它的原型對象崇败。

當我們用ObjectName.propertyName訪問一個對象的屬性時,JavaScript引擎先在當前對象上查找該屬性房蝉,如果沒有找到僚匆,就到其原型對象上找,如果還沒有找到搭幻,就一直上溯到Object.prototype對象咧擂,最后,如果還沒有找到檀蹋,就只能返回undefined松申。

現(xiàn)在我們開始創(chuàng)建一個對象:

var arr = [1,2,3];

其原型鏈如下所示:

arr => Array.prototype => Object.prototype => null

在這里,數(shù)組arr是JavaScript的內(nèi)建對象Array的一個實例俯逾,其原型鏈指向Array的prototype贸桶。Array本身為一種特殊的對象(即key值為0,1,2,3...的鍵值對),因此Array的原型鏈指向Object的prototype桌肴。原型鏈的終點指向null皇筛。

由上例啟發(fā),我們再看一下前面提到的xiaoming與Stutent的關(guān)系:

對象xiaoming的原型鏈

上圖中坠七,小明作為一個Student的實例(可以理解為xiaoming是學(xué)生這個大類下的一個個體)水醋,含有一個名為__proto__的原型鏈指針(標準寫法為[[prototype]]旗笔,許多瀏覽器中為便于區(qū)分顯示為__proto__),該指針指向當前對象的原型的構(gòu)造器(constructor)拄踪。

大多數(shù)情況下蝇恶,__proto__可以理解為“構(gòu)造器函數(shù)的原型”,即:__proto__ === constructor.prototype? (通過Object.create()創(chuàng)建的對象不適于此等式)

有些同學(xué)可能會有疑問惶桐,prototype屬性與__proto__的區(qū)別撮弧。兩者的概念上可以這樣理解:prototype屬性是函數(shù)才擁有的屬性,而每一個對象都有一個指向其原型的__proto__屬性姚糊,其__proto__屬性在一般情況下指向其原型的constructor(即對象的__proto__指向本對象的構(gòu)造器)贿衍。


prototype屬性與__proto__的區(qū)別??


函數(shù)對象與其原型對象的關(guān)系

(2) 對象的原型鏈的理解

JavaScript的原型及原型鏈概念的原理,類似于數(shù)據(jù)結(jié)構(gòu)中的鏈表結(jié)構(gòu)

鏈表是一種物理存儲單元上非連續(xù)叛拷、非順序的存儲結(jié)構(gòu)舌厨,數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的。鏈表由一系列結(jié)點(鏈表中每一個元素稱為結(jié)點)組成忿薇,結(jié)點可以在運行時動態(tài)生成裙椭。

相比數(shù)組而言,鏈表在內(nèi)存中不需要連續(xù)的區(qū)域署浩,只需要每一個節(jié)點都能夠記錄下一個節(jié)點的內(nèi)存地址揉燃,通過引用進行查找,這樣的特點也就造就了鏈表增刪操作時間消耗很小筋栋,而查找遍歷時間消耗很大的特點炊汤。

鏈表的兩種模式(單向鏈表、雙向鏈表)如下圖:

鏈表的兩種模式弊攘。顯然抢腐,JS中的原型概念類似于單向鏈表

簡單了解了鏈表結(jié)構(gòu)后,我們現(xiàn)在可以來了解一下JavaScript中的原型鏈與鏈表的區(qū)別了:


單向鏈表與原型鏈的對比:原型鏈多了指向自身的constructor構(gòu)造函數(shù)

(3) ES6中的Class的理解

前文提到JS中沒有類的概念襟交,是針對ES5而言迈倍。在2015年推出的ES6語法中,JS提供了更接近傳統(tǒng)語言的寫法捣域,引入了 class(類)這個概念啼染,作為對象的模板。通過class關(guān)鍵字焕梅,可以定義類迹鹅。

傳統(tǒng)的ES5中,定義類似“類”的概念贞言,使用的方法是定義一個構(gòu)造函數(shù)斜棚,通過繼承的方式實現(xiàn)“類”的功能:

// 先定義一個函數(shù),強行叫它構(gòu)造函數(shù),構(gòu)造函數(shù)常規(guī)建議首字母大寫:

function Student(name, age) {?

????this.name = name;? ?// 構(gòu)造函數(shù)的屬性都定義在函數(shù)內(nèi)部

????this.age = age;? ?// this指向?qū)嵗龑ο?/p>

?}??

// 構(gòu)造函數(shù)的方法都定義在構(gòu)造函數(shù)的原型上?

Student.prototype.showHisInfo = function () {?

????return? '(' + this.name + ', ' + this.age + ')';?

};?

// new 一個對象弟蚀,就OK了

var xiaoming = new Student('小明', 18);?

當使用class時脂新,結(jié)構(gòu)如下:?

class Student{

????constructor(name,age) {? // 構(gòu)造函數(shù),為類的一部分

????????// 定義將來實例的屬性

????????this.name =?name;?

????????this.age = age;? ?

????}

????// 給類添加方法

????showHisInfo() {

????????return this.name + ','+this.age;? ?// 取到上面兩個屬性值

????}

}

let xiaoming = new Student('小明', 18);


參考文獻:

廖雪峰--面向?qū)ο缶幊蹋?a target="_blank" rel="nofollow">https://www.liaoxuefeng.com/wiki/1022910821149312/1023022126220448

數(shù)據(jù)結(jié)構(gòu)——淺談鏈表:https://blog.csdn.net/weixin_41582192/article/details/81181077

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粗梭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子级零,更是在濱河造成了極大的恐慌断医,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奏纪,死亡現(xiàn)場離奇詭異鉴嗤,居然都是意外死亡,警方通過查閱死者的電腦和手機序调,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門醉锅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人发绢,你說我怎么就攤上這事硬耍。” “怎么了边酒?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵经柴,是天一觀的道長。 經(jīng)常有香客問我墩朦,道長坯认,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任氓涣,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘溉跃。我一直安慰自己宪赶,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布赴背。 她就那樣靜靜地躺著椰拒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凰荚。 梳的紋絲不亂的頭發(fā)上燃观,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音便瑟,去河邊找鬼缆毁。 笑死,一個胖子當著我的面吹牛到涂,可吹牛的內(nèi)容都是我干的脊框。 我是一名探鬼主播颁督,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼浇雹!你這毒婦竟也來了沉御?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤昭灵,失蹤者是張志新(化名)和其女友劉穎吠裆,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烂完,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡试疙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了抠蚣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祝旷。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嘶窄,靈堂內(nèi)的尸體忽然破棺而出怀跛,到底是詐尸還是另有隱情,我是刑警寧澤护侮,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布敌完,位于F島的核電站,受9級特大地震影響羊初,放射性物質(zhì)發(fā)生泄漏滨溉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一长赞、第九天 我趴在偏房一處隱蔽的房頂上張望晦攒。 院中可真熱鬧,春花似錦得哆、人聲如沸脯颜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽栋操。三九已至,卻和暖如春饱亮,著一層夾襖步出監(jiān)牢的瞬間矾芙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工近上, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留剔宪,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像葱绒,于是被迫代替她去往敵國和親感帅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345