我看到互联网上有用于功能编程的接口。
有一些其他语言的示例,但是我的问题是我可以用javascript制作接口吗。
我不需要一切都非常严格。
例如用于从数据库获取行的界面:
在OOP中:
interface DBGet {
public function getResults($filters){}
}
和实现:
class MySQLDb implements DBGet {
public function getResults($filters){
......
}
}
我可以使用函数式编程来转换JavaScript中的代码吗?
谢谢
答案 0 :(得分:0)
JavaScript没有接口的概念。
有关更多详细信息,请参见this other SO answer。本质上说:
没有“此类必须具有这些功能”的概念(即, 本身没有接口),因为:
- JavaScript继承基于对象,而不是类。那不是 直到意识到:
- JavaScript是非常动态的 输入语言-您可以使用适当的方法创建对象, 这将使其符合接口,然后取消所有定义 使它符合要求的东西。颠覆类型是如此容易 系统-甚至不小心! -尝试不值得 并首先创建类型系统。
您可以使用TypeScript。 TypeScript introduces interfaces用于更传统的OO类型系统实现,但是,使用它们存在一些警告,并且无论如何将它们转换为原始JavaScript时,它们只会从代码中剥离。
以下是使用JavaScript实现目标的几种方法:
注意:ES6中引入了Lambda箭头语法。
1-使用两个类(将lambda函数定义为属性)
class MySqlDbGet {
getResults = (filters) => {
// MySQL implementation of "getResults"
};
}
class PostgreSqlDbGet {
getResults = (filters) => {
// PostgreSQL implementation of "getResults"
};
}
methodThatTakesAFunction(new MySqlDbGet().getResults);
methodThatTakesAFunction(new PostgreSqlDbGet().getResults);
2-使用两个对象(将lambda函数定义为属性)
const mySqlDbGet = {
getResults: () => {
// MySQL implementation of "getResults"
}
};
const postgreSqlDbGet = {
getResults: () => {
// PostgreSQL implementation of "getResults"
}
};
methodThatTakesAFunction(mySqlDbGet.getResults);
methodThatTakesAFunction(postgreSqlDbGet.getResults);
3-使用两个变量来保存您的lambda函数
const mySqlGetResults = () => {
// MySQL implementation of "getResults"
};
const postgreSqlGetResults = () => {
// PostgreSQL implementation of "getResults"
};
methodThatTakesAFunction(mySqlGetResults);
methodThatTakesAFunction(postgreSqlGetResults);
然而,要点仍然存在:JavaScript不会将您的对象持有一定的合同。因此,在您的程序中随时 ,您可以将mySqlGetResults
重新分配为"som string"
,并在任何地方将其传递给 < / em> ,直到运行时您都不会收到任何错误消息。您应自行检查可能不是您认为的变量的变量,并处理可能不确定是否按照您的想法定义对象的任何情况。