根据参数类型扩展功能参数

时间:2012-11-21 12:26:45

标签: javascript jquery parameters parameter-passing sinemacula

说明

我有一个传递参数options的函数。此参数可以是 对象 数组 字符串 < / strong>即可。根据参数的不同,将确定要做什么。


更新:我忘了提及,options必须始终作为相同结构的对象(换句话说,它必须始终设置默认值)。 < / p>

我只想定义一次默认值,因此使用过程if语句,因为你提出的一些不是我的首选解决方案,但我会在必要时使用它。

我不想这样做(如果可能的话):

function foo(options){
    switch(typeof options){
        case 'string':
            // do something etc
        break;  
        // etc
    }
}

实施例

如果参数是一个对象,则将其扩展为设置默认值,如下所示:

function foo(options){
    // Extend the options to apply default values
    var options = $.extend({
        bar: 'none',
        baz: []
    },options);         
}

如果参数是字符串,则将options.bar设置为等于字符串并扩展默认值(如下所示):

function foo(options){
    // Set the bar property to equal the supplied string
    var options = {
        bar: options    
    };
    // Extend the options to apply default values
    options = $.extend({
        baz: []
    },options);         
}

如果参数是一个数组,那么将options.baz设置为等于数组,并扩展默认值(如下所示):

function foo(options){
    // Set the baz property to equal the supplied array
    var options = {
        baz: options    
    };
    // Extend the options to apply default values
    options = $.extend({
        bar: 'none'
    },options);         
}

问题

如此有效,我希望能够以任何格式提供参数,并且该函数将根据提供的内容构建相同的options对象。如果没有提供这些值,那么他们会使用默认值。

对不起,这是如此不清楚,很难解释。

附加示例

我(jQuery)可以演示的另一种可能方式是查看像animate()这样的函数。请注意,您可以提供:

.animate( properties [, duration] [, easing] [, complete] )

.animate( properties, options )

这个额外的例子并不是我希望实现的,但它是沿着正确的方向

2 个答案:

答案 0 :(得分:3)

您可以使用各种jQuery帮助函数来确定options的类型:

$.isPlainObject(options)
$.isArray(options)

typeof options === "string"

e.g。

function foo(par) {

    // default values
    var options = {
        bar: 'none',
        baz: []
    };

    if ($.isPlainObject(par)) {
        $.extend(options, par);
    } else if ($.isArray(par)) {
        options.baz = par;
    } else if (typeof options === "string") {
        options.bar = par;
    }

    ...
 }

如果您打算更改任何这些值,请使用.slice()表示阵列副本,使用$.extend()上的深层复制选项,以便更改不会影响所提供的对象。

更新的答案

对于这种特殊情况,答案是:

function foo(parameter){
    var options = {
        package:    'none', // Do not load any packages by default
        packageURL: false, // Do not retrieve the package details from a URL by default
        libraries:  [] // Do not load any libraries by default
    };
    // Determine the type of parameter supplied and 
    // build the options accordingly
    if($.isArray(parameter)){
        // Set libraries option
        parameter = {
            libraries: parameter    
        };
    }else if(typeof parameter === "string"){
        // Set package option
        parameter = {
            package: parameter  
        };
    }
    // Extend the parameter object to include the default values
    $.extend(options, parameter);
}

答案 1 :(得分:1)

您可以使用typeof来确定所提供参数的类型 (typeof "abc" == "string"; typeof {a:1,b:2} == "object"

使用它来确定要执行的代码段(Switch / case或if / else)