【发布时间】:2019-02-02 08:36:51
【问题描述】:
我正在尝试减少我在 JS 对象中编写的重复代码的数量。我有一个我想使用的方法,除了目标之外几乎没有任何变化,我想将其提取出来并以某种方式通过对象属性名称获取目标。希望我放在一起的例子是有意义的。
myObject = {
d: {
get: function(list, id) {
// do stuff
},
prop1: {
data: [],
list: myObject.config.lists.prop1.guid,
get: function(a,b) {
myObject.d.get(a,b)
}
},
// I want to write this once and use the object key ("prop2") as an argument
prop2: {
data: [],
list: myObject.config.lists.prop2.guid,
get: function(a,b) {
myObject.d.get(a,b)
}
}
}
};
尝试了类似的方法,但出现错误“无法读取未定义的道具'spec':”
myObject = {
d: {
get: function(list, id) {
// do stuff
}
},
// Use this to duplicate shared funtions for similar
spec: function(target) {
return {
data: [],
list: myObject.config.lists[target].guid,
get: function() {
myObject.d.get(a, b);
},
update: "",
delete: ""
};
},
// some how return `myObject.spec.get()`, allowing me to use myObject.d.prop1.get()
prop1: myObject.spec.apply(this, "prop1"),
prop2: myObject.spec.apply(this, "prop2")
};
【问题讨论】:
-
请将此简化为一个最小的完整示例。您引用了提供的示例中未定义的内容,这些内容本身缺少右大括号并且相当冗长。您还使用关键字 (get) 作为对象属性。虽然这在 JavaScript 中是合法的,但我会三思而后行。
-
@JaredSmith 清理了它,希望对您有所帮助
-
如果您在对象上调用
.get(),只需使用this.data和this.list... -
为什么不直接将
target属性名称作为参数显式传递给spec()? -
同意@Bergi,虽然我认为整个想法似乎有点复杂,但这是最合乎逻辑的方式,对现有结构的改动最小。
标签: javascript object ecmascript-6