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属性中)复制到新对象,意外更改基础对象的可能性较小。如果您希望通过其他解决方案避免这种情况,则必须创建对象的副本。