【发布时间】:2019-04-16 00:50:02
【问题描述】:
在 JS 或 OOP 语言中,多态性是通过制作不同的类型来创建的。
例如:
class Field {...}
class DropdownField extends Field {
getValue() {
//implementation ....
}
}
想象一下我有带有一些方法的库 forms.js:
class Forms {
getFieldsValues() {
let values = [];
for (let f of this.fields) {
values.push(f.getValue());
}
return values;
}
}
这将获取所有字段值。请注意,图书馆并不关心它是什么字段。
这样开发人员 A 创建了库,开发人员 B 可以创建新字段:AutocompleterField。
他可以在不更改库代码(Forms.js)的情况下在 AutocompleterField 中添加方法。
如果我在 JS 中使用函数式编程方法,我该如何实现呢?
如果我在对象中没有方法,我可以使用 case 语句,但这违反了原则。类似这样:
if (field.type == 'DropdownField')...
else if (field.type == 'Autocompleter')..
如果开发者 B 添加新类型,他应该更改库代码。
那么有什么好的方法可以在不使用面向对象编程的情况下解决 javascript 中的问题。
我知道 Js 不完全是 OOP 也不是 FP,但无论如何。
谢谢
【问题讨论】:
-
供应商和工厂。只是没有类型安全。
-
"案例陈述,但这违反了原则" - 哪个原则?如果你不使用 OOP,你就没有 OOP 原则。此外,JS 完全符合 OOP,只是与 OOP 的风格不同,例如Java。
-
@Amadan 不是 OOP 并不意味着它不能遵循“开闭”原则。在我看来,工厂/供应商是这一理念的一部分。
-
"制作不同的类型" - 您的示例似乎将
class语法与类型混淆了。类型在 JS 中是隐含的。将它们视为您无需在任何地方声明的不可见接口。 -
"不使用面向对象的编程" - 不,你不能在没有对象的情况下使用 JS。而且多态性肯定需要对象。
标签: javascript functional-programming