我正在研究如何在 javascript 中应用函数式编程,并且正在尝试避免使用class关键字。
我不喜欢仅仅为了遵循某种范式而采取极端措施,但我很想知道是否可以在不使用类的情况下编写好的代码。
到目前为止,我主要使用函数取得了成功,但有一种情况我无法真正弄清楚。
当我们有想要在不同对象之间重用的行为时,我们通常(在 OOP 中)创建一个扩展另一个类的类。
class FlyingThing {
private let _isFlying = false
fly() {
_isFlying = true
return this
}
land() {
_isFlying = false
return this
}
isFlying() {
return _isFlying
}
}
class Duck extends FlyingThing {
quack() {
return 'Quack!'
}
}
const duck = new Duck()
console.log(duck.fly().quack())
现在到功能方法...
示例取自:https ://medium.com/javascript-scene/functional-mixins-composing-software-ffb66d5e731c
const flying = o => {
let isFlying = false
return Object.assign({}, o, {
fly () {
isFlying = true
return this
},
isFlying: () => isFlying,
land () {
isFlying = false
return this
}
})
}
const quacking = quack => o => Object.assign({}, o, {
quack: () => quack
})
const createDuck = quack => quacking(quack)(flying({}))
const duck = createDuck('Quack!')
console.log(duck.fly().quack())
好的,我喜欢这个主意;我们正在使用组合,并且我们没有任何父母和孩子之间的紧密耦合。凉爽的。
但是,通常当我们使用类时,子级可以访问父级的成员,并且可能需要在某些方法中使用它。例如:
class FlyingThing {
private let _isFlying = false
fly() {
_isFlying = true
return this
}
land() {
_isFlying = false
return this
}
isFlying() {
return _isFlying
}
}
class Duck extends FlyingThing {
quack() {
return 'Quack!'
}
// New method - Depends on 'isFlying' defined in parent
layEgg() {
if(isFlying) return
return 'Laying egg...'
}
}
const duck = new Duck()
console.log(duck.fly().quack())
所以问题是,我们如何仅使用函数优雅地解决这个问题?
慕的地10843
相关分类