Javascript:Inherit+;修改关联数组?

Javascript:Inherit+;修改关联数组?,javascript,Javascript,我正在寻找一种优雅的方法来覆盖关联数组中的值 例如,假设我的基本选项为: var base_options = { hintText:"something", borderStyle:Titanium.UI.INPUT_BORDERSTYLE_ROUNDED, width: 200, height: LABEL_HEIGHT-4, font: {fontSize:16}, left: 95 } 我想使用它作为基础,但能够根据具体情况覆盖此基础中的一些项目-例如,

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

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

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";
但我怀疑还有更优雅的方式。

像这样的吗

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

for(var prop in changed_options) 
    base_options[prop] = changed_options[prop];
像这样的

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

for(var prop in changed_options) 
    base_options[prop] = changed_options[prop];
如果您碰巧正在使用jQuery,它在jQuery对象上有一个内置的
extend
方法来执行此操作

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);
如果您碰巧正在使用jQuery,它在jQuery对象上有一个内置的
extend
方法来执行此操作

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循环


这可能看起来有些过分,但您可以将所有新实例添加到一个数组中,并在需要更改它们时为它们使用for循环。

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

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});

至于复制对象,已经有了一个很好的方法。

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

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});

至于复制对象,已经有了一个很好的方法。

您可以使用基类来封装Weston propose的行为

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"});

应该有效。

您可以使用基类来封装Weston propose的行为

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"});

应该可以工作。

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

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\u from(A,B\u stuff)
,就可以了。
一个优点是,由于
A
B
的原型,对
A
所做的更改会反映在
B

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

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\u from(A,B\u stuff)
,就可以了。
一个优点是,由于
A
B
的原型,对
A
所做的更改会反映在
B

不应该是
base_options[prop]=changed_options[prop]?不应该是
base_options[prop]=已更改的_options[prop]?这是非常脆弱的代码。按索引引用参数会让你很快陷入问题,读起来也不是特别好。如果你要投反对票并回答,请解释原因。这将帮助我不张贴错误的答案,如果它是错误的。谢谢抱歉@Zebi,我的页面更新速度太慢。这取决于编码人员和他们对所写代码的理解。这与使用索引来访问数组中的每个属性编写for循环没有区别,不是吗?这是不同的,因为如果使用for,则不能因为顺序更改而使属性不匹配。你不能忘记添加一个属性,最后你不能回答问题,因为你没有将默认值与重写值合并。这是非常脆弱的代码。按索引引用参数会让你很快陷入问题,读起来也不是特别好。如果你要投反对票并回答,请解释原因。这将帮助我不张贴错误的答案,如果它是错误的。谢谢抱歉@Zebi,我的页面更新速度太慢。这取决于编码人员和他们对所写代码的理解。这与使用索引来访问数组中的每个属性编写for循环没有区别,不是吗?这是不同的,因为如果使用for,则不能因为顺序更改而使属性不匹配。您不能忘记添加属性,最后您不会回答问题,因为您不会将默认值与重写值合并。这是一个很好的解决方案,因为通过将对象引用(例如,在字体属性中)复制到新对象,意外更改基对象的可能性较小。如果您想在其他解决方案中避免这种情况,则必须创建对象的副本。这是一个不错的解决方案,因为通过将对象引用(例如,在font属性中)复制到新对象,意外更改基础对象的可能性较小。如果您希望通过其他解决方案避免这种情况,则必须创建对象的副本。