【问题标题】:Named arguments in JavaScriptJavaScript 中的命名参数
【发布时间】:2013-03-19 19:04:42
【问题描述】:

假设我有这样的功能

function myFunc(a, b, c)
{
    if(a!=undefined) this.a = a;
    if(b!=undefined) this.b = b;
    if(c!=undefined) this.c = c;
}

我只想设置 b 的值,然后我可以做这样的事情。

myFunc(undefined, "some Value for b", undefined);

但我想知道是否有一种方法可以让我做这样的事情来设置 b 的值

myFunc(b:"some value for b");

这可能是错误的,但您可能明白我的意思。我想指定属性的名称和值,这样我就不必担心传递未定义的值。我该怎么做?

也随意更改标题,我不知道这个问题应该叫什么。

【问题讨论】:

  • “我不知道这个问题应该叫什么”。迄今为止我生命中最有趣的 stackoverflow 时刻......
  • this.a 等的意图是什么?您没有实例化对象,因此 this 将是全局对象。
  • @bfavaretto 是的,我正在使用这个函数来创建对象,尽管这里没有显示
  • "你的意思是说我给出的例子确实有效吗?" 只有当你改变语法以使用对象文字表示法时(即在@987654328 周围添加{} @. 关键概念是您将 Object 作为参数传递。可以使用 object literal 表示法创建对象,如下所示:{ propA: 'valueA', propB: 'valueB' }

标签: javascript function


【解决方案1】:

jsFiddle Demo

当然,就用这个:

function myFunc(options)
{
 if(typeof(options['a']) != "undefined") this.a = options['a'];
 if(typeof(options['b']) != "undefined") this.b = options['b'];
 if(typeof(options['c']) != "undefined") this.c = options['c'];
}

然后调用它

var func = new myFunc({b:"some value for b"});
console.log(func.b);//"some value for b"

【讨论】:

  • @Ojay - 你是对的,选项对象需要检查字符串索引而不是变量索引。
  • @TravisJ 我可能认为他的意思是你缺少括号
  • @AnkurSharma - 啊,简单的事情。固定的。 ;)
  • @OJay 我想知道为什么 obj[i] 有效,为什么 obj.i 无效。看这里 -jsfiddle.net/GyBdz 。只是想了解这里发生了什么。
  • @AnkurSharma 在 for in 循环的情况下,您将传入对象的属性名称分配给变量 i。 this[i] 之所以有效,是因为它用当前属性(即 b)替换了 i,因此实际上分配了 this.b,而 this.i 没有使用变量 i,您实际上是在函数上创建 i 的属性。试试吧,不要用第二个console.log(func.b),改成console.log(func.i)
【解决方案2】:

是的,传入一个对象字面量

function myFunc(options)
{
    if(options.a!=undefined) this.a = options.a;
    if(options.b!=undefined) this.b = options.b;
    if(options.c!=undefined) this.c = options.c;
}

然后这样调用

var var1 = new myFunc({b:"some value for b"});

或用于更动态、可扩展的方式(如前所述)

function myFunc(obj)
{
    for (var i in obj)
    {
        if(obj.hasOwnProperty(i))
        {
            this[i]=obj[i];
        }
    }
}

var func = new myFunc({b:"some value for b"});
console.log(func.b);//"some value for b"

【讨论】:

  • 请注意,如果这样调用,它会将b附加到窗口对象。
【解决方案3】:

您可以通过将 Ojbect 作为参数传递来实现此目的:

var someObject = { a: 'some A value', b: 'some B value' };

myFunc(someObject);

这是一种非常普遍的做法。

例如,jQuery 经常使用这种结构。

如果您查看jQuery.animate() 的文档,您会发现它接受Plain Object 作为第一个参数。

【讨论】:

    猜你喜欢
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多