1

js 文件中有几个方法调用,如下所示:

$("#id_1").someMethod({
  //some common hash values
  key1: "value1",
  key2: "value2",

  // some unique has values
  someKey1: "value123",
  someKey2: "value444"
})

// and so on

您会看到这个想法:一些方法具有一些共同的哈希值(其他方法具有)和一些独特的哈希值,这些值对于每种方法都是不同的。

如何创建一个函数,其中包含所有相同的哈希值,并接收一些额外的哈希值作为参数以简化代码?

更新:虽然使用 jquery 是可以的,但我很好奇不用 jquery 来实现它。

4

5 回答 5

2

jQuery.extend()你要找的吗?

var commonValues = {
    key1: "value1",
    key2: "value2"
};

$('#id').someMethod($.extend({
    someKey1: "value123",
    someKey1: "value444"
}, commonValues));

您应该记住,在此示例中,具有相同键的共享值将覆盖唯一的值。如果这不是所需的行为,您需要提供一个空对象作为第一个参数$.extend()

$.extend({}, commonValues, {
    /* unique values */
};

如果 ifsomeMethod()是你自己的,并且你很乐意修改它,你可以把这个逻辑移到里面:

someMethod: function(values) {
    values = $.extend({}, commonValues, values)
}
于 2013-07-06T15:48:55.980 回答
1

你看过$.extend吗?

我不确定你想要实现什么,但听起来像这样。请注意,这extend将修改第一个参数。

非 jquery 实现可能如下所示:

function addDefaults(overrides, defaults) {
  for(var prop in defaults)
    if(!(prop in overrides))
      overrides[prop] = defaults[prop];
  return overrides;
}

在这里,addDefaults(specific, general)大致相当于$.extend({}, general, specific),但是它改变了specific对象。支持多个参数且不更改任何参数的版本要长一点:

function addDefaults() {
  var retval = {}, arg;
  for(var i=arguments.length-1; i >=0; --i) 
    for(var prop in arg=arguments[i])
        retval[prop] = arg[prop];
  return retval;
}
于 2013-07-06T15:48:35.010 回答
1

您可以使用此代码段:

function concat(a, b) {
  // Shallow copy
  var c = $.extend(b, a);
  return c;
}

示例用法:

common = {
      key1: "value1",
      key2: "value2"
};

$("#id_1").someMethod(concat(common, {
  // some unique has values
  someKey1: "value123",
  someKey2: "value444"
});

如果你需要一个深拷贝,修改它应该不难。

于 2013-07-06T15:49:31.697 回答
1

听起来你正在寻找这样的东西:

var commonValues = {
    key1 : "value1",
    key2 : "value2"
};

function helperFunc(additionalOptions) {
    $("#id_1").someMethod($.extend({}, additionalOptions, commonValues));
}

helperFunc({ someKey1: "value123", someKey2: "value444" });

$.extend 文档

如果你不想使用 jQuery,你可以看看别人的实现extend,例如Underscore 的 _.extend,并自己制作。

于 2013-07-06T15:50:04.330 回答
0

由于您使用了“我如何创建函数”的表达方式,我假设这someMethod是您编写的函数。在这种情况下,您可以让函数接受两个参数,一个用于公共键,一个用于唯一键。然后您可以使用该bind函数将您的公共键对象绑定到该函数:

var obj = {};

obj.someMethod = function(commonKeys, uniqueKeys){
    console.log(commonKeys);
    console.log(uniqueKeys);
};

var newFunction = obj.someMethod.bind(obj, {key1: 1, key2: 2});

newFunction({ukey1: 1, ukey2: 2});

通过这种方式,您可以创建一个新函数,您只能使用您的唯一键调用该函数,而自动提供公共键。

小提琴

于 2013-07-06T15:57:07.927 回答