我正在研究如何在 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/tical-mixins-composition-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())
那么问题是,我们如何仅使用函数来优雅地解决这个问题?