如何验证JavaScript对象中的方法是否遵循特定接口?
我对JS比较陌生,也遇到过这种情况,在这种情况下,我需要确定JS对象中定义的方法是否遵循特定的接口 让我举一个例子来解释:如何验证JavaScript对象中的方法是否遵循特定接口?,javascript,node.js,Javascript,Node.js,我对JS比较陌生,也遇到过这种情况,在这种情况下,我需要确定JS对象中定义的方法是否遵循特定的接口 让我举一个例子来解释: let logger1 = { log: function(message, meta){ //logging functionality } }; let logger2 = { log: function(level, message, meta){ //logging functionality } }
let logger1 = {
log: function(message, meta){
//logging functionality
}
};
let logger2 = {
log: function(level, message, meta){
//logging functionality
}
}
有两个记录器对象(logger1或logger2),它们有自己的日志功能。它们可以从客户端传递到客户端使用的库库希望log方法具有特定的接口,这已在库文档中提到。在库内部,我们如何验证传入的logger对象是否具有与库所期望的接口匹配的“log”方法
let Library = function(logger){
//Here I can verify if the 'log' function is defined. But how do i make sure the log
//function matches the interface that the library is expecting ?
//Let's say the interface that the library is expecting is function(level,message,meta),
//which is satisfied only by logger2.
if(logger && typeof(logger.log) === 'function'){
this.logger = logger;
}
else{
this.logger = console;
}
}
let lib1 = new Library(logger1);
let lib2 = new Library(logger2);
你真的不能。Javascript函数可以省略它不使用的参数,因此该函数的参数可能较少,并且仍然兼容。该函数可以定义更多参数,如果未通过,这些参数将变为未定义,因此仍然兼容。它可以在内部使用,因此不定义任何参数,并且仍然兼容。它可能会以任何方式命名其任何参数,并且仍然兼容,因此即使检查参数名称也不会对您有任何帮助
你唯一能做的就是使用类似的方法并添加编译时检查。你真的不能。Javascript函数可以省略它不使用的参数,因此该函数的参数可能较少,并且仍然兼容。该函数可以定义更多参数,如果未通过,这些参数将变为未定义,因此仍然兼容。它可以在内部使用,因此不定义任何参数,并且仍然兼容。它可能会以任何方式命名其任何参数,并且仍然兼容,因此即使检查参数名称也不会对您有任何帮助
唯一可以做的事情是使用类似的方法并添加编译时检查。函数有一个属性length属性,它提供了它所持有的参数数量 例如:
let logger1 = {
log: function(message, meta){
//logging functionality
}
};
console.log(logger1.log.length); // 2
let logger2 = {
log: function(level, message, meta){
//logging functionality
}
}
console.log(logger2.log.length); // 3
函数有一个属性length属性,它给出了它所持有的参数的数量 例如:
let logger1 = {
log: function(message, meta){
//logging functionality
}
};
console.log(logger1.log.length); // 2
let logger2 = {
log: function(level, message, meta){
//logging functionality
}
}
console.log(logger2.log.length); // 3
嗯,棘手的一个。
我们将首先确定接口,然后确定实现。在这种情况下,我们将对logger1进行编码,使其具有签名:(message,meta)
和logger2(message,meta,level)
这样我们就可以调用任何一个函数,例如,('test','extra',1)
,logger1将忽略level参数
如果您使用的系统必须处理许多不同的参数化版本,那么最好每次只使用一个对象作为唯一的参数:function(config)
,并在需要时添加额外的属性。
这样,您还可以强制界面保持不变,同时以某种方式进行扩展。嗯,这是一个棘手的问题。
我们将首先确定接口,然后确定实现。在这种情况下,我们将对logger1进行编码,使其具有签名:(message,meta)
和logger2(message,meta,level)
这样我们就可以调用任何一个函数,例如,('test','extra',1)
,logger1将忽略level参数
如果您使用的系统必须处理许多不同的参数化版本,那么最好每次只使用一个对象作为唯一的参数:function(config)
,并在需要时添加额外的属性。
通过这种方式,您还可以强制界面保持不变,同时以某种方式进行扩展。嗨,Boney,JavaScript不支持此功能,因为它是一种松散类型的编程语言,如果您确实需要此功能,也许您可以使用TypeScript。嗨,Boney,JavaScript不支持此功能,因为它是一种松散类型的编程语言,如果你真的需要这个,也许你可以使用TypeScript。