У меня есть 3 класса, все расширяют предыдущий.
Сущность -> Тело -> Игрок
У каждого есть die()
метод, который делает очень разные вещи.
Entity.die()
будет вызывать дБ
Body.die()
оживит тело
Player.die()
вызывает пользовательский интерфейс и воспроизводит специальный звук.
Я не хочу вручную вызывать Entity.die()
внутри Body.die
метода, в основном потому, что у меня много классов и много общих методов, и я не хочу что-то забывать.
Я написал этот небольшой фрагмент кода, который делает именно это, стек ошибок легко понять и указывает на правильные строки.
function overLoadMethods (parent, children) {
const methods = {}
for (let [fname, fn] of Object.entries(parent)) {
if (typeof fn === 'function') {
if (children[fname]) {
methods[fname] = function () {
fn()
children[fname]()
}
Object.defineProperty(methods[fname], 'name', { value: fname })
} else {
methods[fname] = fn
}
}
}
return methods
}
function createEntity () {
return {
die: () => {
console.log(new Error().stack)
console.log('entity die')
}
}
}
const bodyMethods = {
die: () => {
console.log(new Error().stack)
console.log('body die')
}
}
function createBody () {
const entity = createEntity()
const overLoadedMethods = overLoadMethods(entity, bodyMethods)
return {
...entity,
...bodyMethods,
...overLoadedMethods
}
}
const playerMethods = {
die: () => {
console.log(new Error().stack)
console.log('player die')
}
}
function createPlayer () {
const body = createBody()
const overLoadedMethods = overLoadMethods(body, playerMethods)
return {
...body,
...playerMethods,
...overLoadedMethods
}
}
const player = createPlayer()
// will call Entity.die() then Body.die() then Player.die()
player.die()
Все работает нормально, но я никогда не видел эту схему раньше, и я думаю, что есть веская причина, о которой я не знаю.
Может ли кто-нибудь указать на слабость этого паттерна, если он есть (уверен, что он есть)?