我想在Javascript中创建一个界面,有没有人知道如何做到这一点?
在PHP中,我可以为多个数据库创建一个接口:
interface Database{
function connect($dsn,$user,$pass,$option);
function prepare($query);
function find($table,$column,$condition);
function save($table,$column,$condition);
}
class MySQL implements Database{
function connect($dsn,$user,$pass,$option){ ... }
function prepare($query){ ... }
function find($table,$column,$condition){ ... }
function save($table,$column,$condition){ ... }
}
class Oracle implements Database{
function connect($dsn,$user,$pass,$option){ ... }
function prepare($query){ ... }
function find($table,$column,$condition){ ... }
function save($table,$column,$condition){ ... }
}
稍后,当我需要查询表时,我只需执行:
$db = new MySQL;
$db->find('table','column','condition');
答案 0 :(得分:1)
您可以简单地使用这组函数创建一个对象,然后可以将另一个对象替换为另一个数据库的相应函数。
dbInterface={
search:function(searchstring){
this.oracleDB.somethingDo(searchstring)
}
,oracleDB=new Oracle("foobar")
}
//dbInterface is now an object with the method "search".
在这种情况下,this
引用该函数所附加的对象
一种常见的方法是使用也用作闭包的构造函数来构建这些对象,从而提供方便的局部范围:
function MySQLinteface(initialization, parameters){
var dbConnection=connect(parameters)
this.search=function(searchstring){
dbConnection.doSomething(searchstring)
}
}
dbInterface=new MySQLinteface("foo", "bar")
//dbInterface is now an object with the method "search".
在这种情况下,this
是构造函数的返回对象,因为它是使用new
关键字调用的。
在这两种情况下,关键部分是你得到一个公开方法search
的对象。你不必正式定义一个界面,你只需要考虑你希望你的界面如何,然后你可以以任何你喜欢的方式重新实现它,让所有这些实现都是插件替换彼此。
答案 1 :(得分:1)
我已经创建了一个可以确定为接口的函数:
var MySQL = function(){
DatabaseInterface(this);
};
MySQL.prototype.connect = function(dsn,user,pass,option){
//
};
MySQL.prototype.prepare = function(query){
//
};
MySQL.prototype.find = function(table,column,condition){
//
};
MySQL.prototype.save = function(table,column,condition){
//
};
new MySQL;
function DatabaseInterface(con){
if(!'connect' in con || !getParamNames(con.connect) == "dsn,user,pass,option")
throw new Error("This method is not correctly overwritten1!");
if(!'prepare' in con || !getParamNames(con.prepare) == "query")
throw new Error("This method is not correctly overwritten2!");
if(!'find' in con || !getParamNames(con.find) == "table,column,condition")
throw new Error("This method is not correctly overwritten3!");
if(!'save' in con || !getParamNames(con.save) == "table,column,condition")
throw new Error("This method is not correctly overwritten4!");
}
var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
function getParamNames(func) {
var fnStr = func.toString().replace(STRIP_COMMENTS, '')
var result = fnStr.slice(fnStr.indexOf('(')+1, fnStr.indexOf(')')).match(/([^\s,]+)/g)
if(result === null)
result = []
return result
}
在你是mysql类的构造函数中,你说要调用DatabaseInterface函数。该函数检查它是否是正确的数据库连接器。如果不是,他会抛出错误。这很奇怪,但它按预期工作。
但请看看电子商务的答案以及所有其他评论。在javascript中没有接口,在大多数情况下你不需要它。
答案 2 :(得分:0)
JavaScript不是静态类型的,因此无法声明任何接口。您只需创建履行合同的对象(如果需要,您可以动态测试对象是否提供此类方法)。这称为duck typing - 如果对象具有connect
,prepare
,find
和save
方法,我们认为它是数据库接口。有各种辅助函数库可以简化这些测试的声明/创建。