Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何验证JavaScript对象中的方法是否遵循特定接口?_Javascript_Node.js - Fatal编程技术网

如何验证JavaScript对象中的方法是否遵循特定接口?

如何验证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 } }

我对JS比较陌生,也遇到过这种情况,在这种情况下,我需要确定JS对象中定义的方法是否遵循特定的接口

让我举一个例子来解释:

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。