是否有用于强制方法签名的Javascript库?

是否有用于强制方法签名的Javascript库?,javascript,architecture,backbone.js,unobtrusive-javascript,signature,Javascript,Architecture,Backbone.js,Unobtrusive Javascript,Signature,我想为某些Javascript方法指定哪些属性是必需的,它们应该匹配什么模式,以及如果不匹配,如何响应 这是因为在方法级别检查必需和可选参数会导致大量重复代码 就拿这个例子来说。这里我想建造一个灯箱。如果他们向我发送字符串,我将显示一个只包含内容的lightbox。如果他们向我发送选项对象,我会查找“标题”和“内容”。能够以某种标准化的方式来指定这一点不是很好吗 // Static method for generating a lightbox // callerOptions = '' //

我想为某些Javascript方法指定哪些属性是必需的,它们应该匹配什么模式,以及如果不匹配,如何响应

这是因为在方法级别检查必需和可选参数会导致大量重复代码

就拿这个例子来说。这里我想建造一个灯箱。如果他们向我发送字符串,我将显示一个只包含内容的lightbox。如果他们向我发送选项对象,我会查找“标题”和“内容”。能够以某种标准化的方式来指定这一点不是很好吗

// Static method for generating a lightbox
// callerOptions = '' //if sent a string, the lightbox displays it with no title
// callerOptions = {
//      content: '' // required popup contents. can be HTML or text.
//  ,   title: '' // required title for the lightbox
//  ,   subtitle: '' // optional subtitle for lightbox
//  }
lightbox = function (callerOptions) {
    if (!callerOptions) {
        log.warn(_myName + ': calling me without a message to display or any options won\'t do anything');
        return;
    }

    // If they send us a string, assume it's the popup contents
    if (typeof(callerOptions) === 'string') {
        this.options = {};
        this.options.content = callerOptions;

    // Otherwise assume they sent us a good options object
    } else {
        this.options = callerOptions;
    }

    _build();
    _contentLoaded();
};
我希望能够使用一些我从未听说过的图书馆来做这样的事情:

// Maybe this is what it looks like with a method signature enforcement library
lightbox = function (callerOptions) {
    TheEnforcer(
    ,   {   valid: [
                'string' // assumes that it is testing type against arguments by convention
            ,   'typeof([0].title) === "string" && typeof([0].content) === "string"'
            ]
        }
    });

    // If they send us a string, assume it's the popup contents
    if (typeof(callerOptions) === 'string') {
        this.options = { 'content': callerOptions };

    // Otherwise we know they sent us a good options object
    } else {
        this.options = callerOptions;
    }

    _build();
    _contentLoaded();
};
有人见过这样的Javascript库吗?可能内置在1000个JS MV*框架中

编辑: 看起来这通常由MV*框架负责。Backbone.js在其模型属性上同时具有验证值和默认值。我认为这些可以用来满足或接近满足我在这里介绍的用例。

(这本来是一个注释,但比预期的要长。)

我理解这样的功能有时可能有用,但我认为应该尽可能避免使用。我认为ECMA标准不应该包括这一点

以您的例子:灯箱标题和内容是必需的。为什么?为什么不显示一个没有标题或内容的空灯箱?在我看来,这是一个不错的退路。如果您正在构建一个API,使用它的任何人都可以检查空标题和内容,如果需要,只需不调用lightbox函数即可。另外,我不喜欢尝试在JS中强制类型的想法


我认为这与jQuery完全不同。它们只是提供了一个可链接的包装器对象(里面有一堆有用的方法),并支持某种编码/语法风格,这就是jQuery的大部分内容。它使语言看起来更简单,与类型和方法签名不同-绝对不是“尽可能简单”(很抱歉)。

我想这有两个部分,哲学/架构和实现

在哲学方面,我认为没有什么比明确的期望和错误消息更简单的了(对于我的API用户,而不是对于我,API开发人员),这些期望和错误消息描述了每种方法需要什么和不需要什么

在实施方面,这就是问题的初衷,我想我必须回答我自己的问题。js的模型,特别是.validate部分,似乎很好地满足了这一需求。我还没有用过它们,但这是迄今为止我发现的唯一类似的东西

编辑:
另一个解决方案可能是编译时。Google Closure编译器似乎很好地处理了这个问题:

我认为您不应该试图强迫一种语言以其未设计的方式运行。只是我的意见。为什么不创建一个“helper类”,它负责传递给lightbox的数据?lightbox应该执行它打算执行的操作,而不是检查参数。顺便说一句,typeof不带括号。这里的括号表示“theforcer”使用一系列参数作为测试对象。对不起,那不是clear@bfavaretto+1每种语言都有自己的哲学,你应该使用它,而不是试图忽视/避免/改变。了解该功能为何以这种方式工作,并将其用于您的优势。@bfavaretto:我不同意这些“遵循语言意图”的评论。这种态度似乎会阻止jQuery。我说的是在这里添加一个特性,而不是试图让它看起来像一种经典语言。我认为这无疑是一个有用的特性。至于选择不同的语言,JS本质上是基于web的丰富交互的唯一选择。我们所能做的最好的事情(事实上,正如其他人所做的那样)是构建框架来添加特性,并希望ECMAscript委员会选择好的特性。