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

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

举这个例子。在这里,我想建立一个灯箱。如果他们给我发送一个字符串,我将显示一个仅包含内容的灯箱。如果他们给我发送了一个选项对象,我会寻找“标题”和“内容”。能够以某种标准化的方式指定它不是很好吗?

// 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,则使用该API的任何人都可以检查空白标题和内容,并且可以根据需要不调用lightbox函数。另外,我不喜欢尝试在JS中强制类型的想法。

我认为这与jQuery完全不同。它们只是提供一个可链接的包装器对象(内部包含许多有用的方法),并且偏爱某种编码/语法样式,这就是jQuery的大部分。与类型和方法签名强制执行不同,它使语言看起来更简单-绝对不像“可能简单”那样(抱歉)。

07-24 09:44
查看更多