Javascript:继承+修改关联数组?

时间:2010-08-25 20:57:30

标签: javascript

我正在寻找一种优雅的方法来覆盖关联数组中的值。

例如,假设我的基本选项为:

var base_options = {
    hintText:"something",
    borderStyle:Titanium.UI.INPUT_BORDERSTYLE_ROUNDED,
    width: 200, height: LABEL_HEIGHT-4,
    font: {fontSize:16}, left: 95
}

我想以此为基础,但能够根据具体情况覆盖此基础中的一些项目 - 例如,hintText对于每个项目都是不同的。通过修改一些参数来获取此数组副本的干净而优雅的方法是什么?

我意识到我可以更改每个项目,如:

options.hintText = "new thing";

但我怀疑这是一种更优雅的方式。

6 个答案:

答案 0 :(得分:1)

您可以使用基类来封装Weston建议的行为。

function Options(changed_options) {
     this.hintText = "something";
     this.borderStyle =Titanium.UI.INPUT_BORDERSTYLE_ROUNDED;
     // ...

     if(changed_options)
         for(var prop in changed_options) 
             this[prop] = changed_options[prop];
}

var foo = new Options({ "hintText":"changed"});

应该工作。

答案 1 :(得分:0)

这样的东西?

var changed_options = { 
   hintText: "somethingElse",
   font: {fontSize: 24} 
}

for(var prop in changed_options) 
    base_options[prop] = changed_options[prop];

答案 2 :(得分:0)

function merge(base, options) { 
   var result = {};
   for (var k in base) if (base.hasOwnProperty(k)) {
      result[k] = options[k] || base[k];
   } // note, it will leave out properties that are in options, but not in base..
   return result;
}

如果你碰巧使用jQuery,它在jQuery对象上有一个内置的extend方法来执行此操作。

答案 3 :(得分:0)

我已经在我的一些项目中实现了这个功能:

if (typeof Object.merge !== 'function') {
    Object.merge = function (o1, o2) { // Function to merge all of the properties from one object into another
        for(var i in o2) { o1[i] = o2[i]; }
        return o1;
    };
} 

所以,现在我可以使用它:

Object.merge(options, {hintText: "new thing", left: 55});

就复制对象而言,已有一个很好的StackOverflow discussion

答案 4 :(得分:0)

您可以使用对象的原型来建立继承,如下所示:

function inherited_object(extra_properties){
    for(var i in extra_properties){
        this[i] = extra_properties[i];
    }
}
function inherit_from(parent, extra_properties){
    inherited_object.prototype = parent;
    var obj = new inherited_object(extra_properties || {});
    inherited_object.prototype = null;
    return obj;
}

然后,如果你有一个对象A,你只需要调用B = inherit_from(A, B_stuff)就可以了。 一个优点是,因为AB的原型,对A所做的更改会反映在B上。

答案 5 :(得分:-1)

var base_options = function() { 
    hintText:arguments[0], 
    borderStyle:arguments[1], 
    width:arguments[2],
    height:arguments[3], 
    font:arguments[4]
    left:arguments[5]
};

var thisObj = new base_option(blah, blah, blah, blah, blah);

这可能看起来有点矫枉过正,但是你可以将所有新实例添加到数组中,并在需要/需要更改它们时使用for循环。