前端系統(tǒng)學(xué)習(xí) 7. 面向?qū)ο缶幊?原型鏈

面向?qū)ο缶幊?/h2>

面向過程:關(guān)注的重點在動詞廷没。分析出解決問題的步驟糊饱,然后用函數(shù)來實現(xiàn)這些步驟,使用的時候一次調(diào)用颠黎。

面向?qū)ο螅宏P(guān)注的重點在主謂另锋。把構(gòu)成問題的事物分解成各個對象,構(gòu)建對象的目的不是為了完成步驟狭归,而是為了描述事物在整個解決問題的過程中的行為夭坪。

面向?qū)ο蟮奶攸c是什么?

  • 封裝:部分屬性和行為是對象私有的唉铜,不提供給對象訪問台舱,只提供部分對外接口,防止對象核心數(shù)據(jù)被篡改潭流【和铮可以在一定程度上保證對象的完整性和功能的健全。

  • 繼承:為了代碼的復(fù)用灰嫉,子類可以從父類繼承一些屬性和方法拆宛。當(dāng)然子類也可以有自己獨有的額外屬性和方法。

  • 多態(tài):不同對象 作用的 同一行為 產(chǎn)生的 不同的效果讼撒。把 做什么 和 誰去做 分開了浑厚。不同對象復(fù)用了同一行為。

比如下棋的過程:

面向過程的:開局 - 黑方下棋 — 展示畫布 — 檢查勝負(fù) - 白方下棋 - 展示畫布 - 檢查勝負(fù) -------- 循環(huán)

用代碼表示:
init()
blackPlay()
repaint()
check()
whitePlay()
repaint()
check()
...

面向?qū)ο蟮模浩灞P根盒、玩家

棋盤.開局 - 棋手.下棋 - 棋盤.重新展示 - 棋盤.檢查勝負(fù) - 棋手.下棋 -----

const checkerBoard = new CheckerBoard()
// 對象在新建的時候會自動去完成初始化钳幅,開局等操作

const wPlayer = new Player('white')
const bPlayer = new Player('black')

wPlayer.play()
bPlayer.play()
// 棋手在操作 play 之后,棋盤可能會監(jiān)聽到相應(yīng)的事件炎滞,并自動去重新展示敢艰、檢查勝負(fù)等,無需手動操作册赛。這里再次可以看出面向?qū)ο笾行氖窃诿枋鏊婕暗降膶ο蟮男袨槟频迹皇菫榱四骋粋€目的而去做的操作震嫉,更符合事物的特點。

面向?qū)ο蟮奶匦栽谶@個例子中的表現(xiàn)

  • 封裝:Player, CheckerBoard 類的使用者只需要關(guān)注對象暴露的接口牡属,無需關(guān)心類的內(nèi)部實現(xiàn)票堵。

  • 繼承

  • 多態(tài):白方和黑方選手,下棋逮栅,白棋/黑棋悴势;白方勝利/黑方勝利

什么時候適合使用面向?qū)ο蟮木幊趟枷耄?/h3>

在比較復(fù)雜/參與方較多的問題,面向?qū)ο罂梢愿玫睾喕瘑栴}证芭,更方便維護(hù)和擴展瞳浦。

在簡單的問題面前担映,這兩種思想沒什么差別废士,甚至面向過程更方便一些。

JS 中的面向?qū)ο?/h3>

方法
屬性

Object Array Date Function RegExp

創(chuàng)建對象

  1. 普通方式(創(chuàng)建空對象蝇完,補上屬性和方法)官硝。無復(fù)用
const Player = new Object()
player.name = 'ss'
player.play = function () {

}

工廠模式。無法判斷實例的類型

function createPlayer(name) {
  const Player = new Object()
  player.name = name
  player.play = function () {

  }
  return player
}
  1. 構(gòu)造函數(shù)/實例
function Player (name) {
  this.name = name 
  this.start = function () {

  }
}

const p1 = new Player('w')
const p2 = new Player('b')
  1. 原型
function Player(name) {
  this.name = name
}

Player.prototype.start = function () {

}

將方法放到原型鏈上優(yōu)化了內(nèi)存占用

  1. 靜態(tài)屬性/方法 實例屬性/方法

原型及原型鏈

怎么找到 Player 的原型對象短蜕?怎么找到更上級的原型對象氢架?

function Player (name) {
  this.name = name
}

Player.prototype.start = function () {
  console.log('下棋')
}

const p1 = new Player('1')
const p2 = new Player('2')
console.log(Player.prototype)
// { start: [Function (anonymous)] }
console.log(p1.__proto__)
// { start: [Function (anonymous)] }
console.log(Player.prototype === p1.__proto__)
// true


console.log(Player.prototype.constructor === Player)
// true

實例.proto === 構(gòu)造函數(shù).prototype

console.log(Player.__proto__)
// {}
console.log(Player.__proto__ === Function.prototype)
// true

構(gòu)造函數(shù)的上游原型是一個對象

到現(xiàn)在為止我們并沒有一個直接的對象是指向某個原型鏈上游的對象的,這就是他們?yōu)槭裁纯雌饋砟敲瓷衩嘏竽В鋵嵕椭皇莻€普通的對象而已岖研。

new 關(guān)鍵字做了什么

  1. 創(chuàng)建一個空對象
  2. 把該對象的 __proto__ 指向構(gòu)造函數(shù)的 prototype
  3. 把構(gòu)造函數(shù)的 this 顯示指向新創(chuàng)建的對象并調(diào)用構(gòu)造函數(shù)
  4. 返回值
    1. 如果構(gòu)造函數(shù)沒有顯示的返回值,返回 this
    2. 如果構(gòu)造函數(shù)的返回值是 number string boolean 這種基本數(shù)據(jù)類型警检,返回 this
    3. 如果構(gòu)造函數(shù)的返回值是一個對象孙援,那就返回這個對象
function mockNew() {
  const obj = new Object()
  const constructor = Array.prototype.shift.call(arguments, 1)
  obj.__proto__ = constructor.prototype

  // const obj = Object.create(constructor.prototype)
  
  const result = constructor.apply(obj, arguments)
  return typeof result === 'object' ? result : obj
}

function Player(name) {
  this.name = name
}

const p = mockNew(Player, 'ss')

console.log(p) // Player { name: 'ss' }
console.log(p instanceof Player) // true
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市扇雕,隨后出現(xiàn)的幾起案子拓售,更是在濱河造成了極大的恐慌,老刑警劉巖镶奉,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件础淤,死亡現(xiàn)場離奇詭異,居然都是意外死亡哨苛,警方通過查閱死者的電腦和手機鸽凶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來建峭,“玉大人玻侥,你說我怎么就攤上這事〖W海” “怎么了使碾?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵蜜徽,是天一觀的道長。 經(jīng)常有香客問我票摇,道長拘鞋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任矢门,我火速辦了婚禮盆色,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘祟剔。我一直安慰自己隔躲,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布物延。 她就那樣靜靜地躺著宣旱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叛薯。 梳的紋絲不亂的頭發(fā)上浑吟,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機與錄音耗溜,去河邊找鬼组力。 笑死,一個胖子當(dāng)著我的面吹牛抖拴,可吹牛的內(nèi)容都是我干的燎字。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼阿宅,長吁一口氣:“原來是場噩夢啊……” “哼候衍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起家夺,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤脱柱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拉馋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體榨为,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年煌茴,在試婚紗的時候發(fā)現(xiàn)自己被綠了随闺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蔓腐,死狀恐怖矩乐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤散罕,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布分歇,位于F島的核電站,受9級特大地震影響欧漱,放射性物質(zhì)發(fā)生泄漏职抡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一误甚、第九天 我趴在偏房一處隱蔽的房頂上張望缚甩。 院中可真熱鬧,春花似錦窑邦、人聲如沸擅威。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽郊丛。三九已至,卻和暖如春派继,著一層夾襖步出監(jiān)牢的瞬間宾袜,已是汗流浹背捻艳。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工驾窟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人认轨。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓绅络,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嘁字。 傳聞我的和親對象是個殘疾皇子恩急,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355

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