您當前的位置:首頁 > 舞蹈

如何使用ES7 Decorator給你的遊戲人物開掛

作者:由 浪子 發表于 舞蹈時間:2017-09-27

// 預告: 本文有點小難度,對js不太熟的人可能比較懵逼

// 本文的目的是讓你們知其然

// ==========================================

// 今天我們來說一說 es7的 裝飾者模式(Decorator)

// 啥是裝飾者模式,聽著很高大上

// 我不和你扯什麼設計模式,超程式設計,我從一個遊戲的例子給大家講解

// 裝飾器就是給一個遊戲玩家裝飾上了一件牛逼的裝備

// ES7 如何使用Decorator強化你的裝備

// 1。 一個普通的玩家類,具有攻擊力和防禦力兩項屬性

class

玩家

{

// 預設 1點攻擊,1點防禦

constructor

攻擊力

=

1

防禦力

=

1

{

this

init

攻擊力

防禦力

}

// 初始化攻擊力 防禦力

init

攻擊力

防禦力

{

this

攻擊力

=

攻擊力

this

防禦力

=

防禦力

}

print

()

{

console

log

`玩家 ==> 攻擊力:

${

this

攻擊力

}

, 防禦力:

${

this

防禦力

}

`

}

}

let

player1

=

new

玩家

()

// 建立一個玩家例項

player1

print

()

// ‘玩家 ==> 攻擊力:1, 防禦力:1’

// 2。 這一步厲害了

// 我們建立一個方天畫戟的裝飾器,一出生自動加100攻擊力

// 裝飾器接受三個固定引數, (目標,屬性,屬性描述)

function

方天畫戟

target

prop

descriptor

{

let

func

=

descriptor

value

// 獲取目標的init方法

descriptor

value

=

function

()

{

// arguments[0]即第一個引數 => 攻擊力

arguments

0

+=

100

// 攻擊力+100

return

func

apply

target

arguments

// init(100, 1)

}

return

descriptor

// 知道為什麼要返回它麼

}

// 升級版玩家,出生自帶方天畫戟

class

玩家2

{

constructor

攻擊力

=

1

防禦力

=

1

{

this

init

攻擊力

防禦力

}

// 在init初始化方法上寫上 ‘@裝飾器名稱’ 就把外掛加上了

// 另外裝飾器是可以疊加的

// @馬雲 艾特一下馬雲,讓你更有錢

// 這下子牛逼了

@

方天畫戟

init

攻擊力

防禦力

{

this

攻擊力

=

攻擊力

this

防禦力

=

防禦力

}

print

()

{

console

log

`玩家 ==> 攻擊力:

${

this

攻擊力

}

, 防禦力:

${

this

防禦力

}

`

}

}

let

player2

=

new

玩家2

()

// 升級版玩家

player2

print

()

// ‘玩家 ==> 攻擊力:101, 防禦力:1’

// 目前Decorator特性還沒有任何瀏覽器支援

// 本文的程式碼需要使用babel編譯之後才會看到結果

// *題外話*,如果你想知道Decorator是幹什麼的,本文可以幫助您理解

// 如果你想徹底搞懂Decorator,你還需要了解Object。defineProperty

// Object。defineProperty很強大,前端同學常用的vue就是基於此做的資料響應式

// 熟悉Java Python的同學對Decorator應該早已很熟悉了,強大的AOP,資料對映等等

// 本文完

// 最後,中英文切換真他媽累,知乎編輯器真他媽難用

標簽: 攻擊力  防禦力  玩家  init  decorator