引用嵌套JavaScript对象的最有效方法是什么?到目前为止,我找到了一对,我想知道哪个是最有效的,如果还有其他的比我在这里列出的更好。问题涉及使用根对象,类似于许多JavaScript框架使用的对象。 根对象是强制性的。请不要发布不使用根对象的答案。
请注意,这特别适用于名称较长的根/子根对象 - 引用a.b
将毫无用处,而引用abcdefghijklm.nopqrstuvwxyz
则非常有用。
修改
只是为了澄清一些事情:
对象foo
包含各种子对象bar
,baz
和qux
,每个子对象都包含各种其他对象。
var foo = {
bar: {
bar: {},
baz: {},
qux: {}
},
baz: {
bar: {},
baz: {},
qux: {}
},
qux: {
bar: {},
baz: {},
qux: {}
}
};
第一种方法涉及为每个子对象创建一个变量。
var bar = foo.bar;
var baz = foo.baz;
var qux = foo.quz;
然后可以通过foo.bar.baz
和bar.baz
通过foo.qux.qux
引用 qux.qux
。
优点:
缺点:
第二种方法涉及创建一个返回子对象的函数,具体取决于几个参数。
function ref(a, b) {
//Ensure that the first parameter is passed:
if (!a) {
return false;
}
return foo.a.b;
};
然后可以通过foo.bar.baz
引用 ref("bar", "baz")
,通过foo.qux,qux
引用ref("qux", "qux")
。
优点:
缺点:
a
,那么使用引用函数实际上会延长代码。答案 0 :(得分:2)
假设我们有一个图形控件对象,它是GraphicObject类(函数)的一个实例。
让我们说一个实例看起来像:
grControl = {
visual : {
boundingBox : { x : , y : , width: , height : ... },
...
},
action : {
...
}
};
创建快捷方式的正确方法是:
•在将使用它的函数中的var中本地缓存适当的对象:
function drawBBox (someGraphicControl) {
var bbox = someGraphicControl.visual.boundingBox;
// maybe you want also to cache sub-properties :
var width = bbox.width;
...
}
•在原型上定义一个getter和/或setter,它将提供对嵌套属性的访问:
// read-only example
Object.defineProperty(GraphicControl.prototype, 'width',
{ get : function() {
return this.visual.boundingBox.width },
enumerable : true};
// read-write example
Object.defineProperty(GraphicControl.prototype, 'width',
{ get : function() {
return this.visual.boundingBox.width },
set : function(val) {
this.visual.boundingBox.width = val ; },
},
enumerable : true};
这样你可以使用:
grObject.width
并完全参考:
grObject.visual.boundingBox.width
答案 1 :(得分:1)
javascript中的常规做法取决于具体情况:
1)在特定功能中对该对象进行一次性访问。如果您只是一次访问深度嵌套的引用,则只需将所有干预措施拼写出来名称:
var data = foo.baz.quz.prop1;
2)对特定嵌套对象的多次访问。如果对特定深度嵌套对象有多个引用,则创建一个指向公共对象的临时局部变量,然后从在本地函数内。
function getDeepData() {
var obj = foo.baz.quz;
var prop1 = obj.prop1;
var prop2 = obj.prop2;
var prop2 = obj.prop3;
// code that uses prop1, prop2 and prop3 here
}
3)迭代属性谁的名字事先不知道。由于您事先不知道属性名称,这是通过一次迭代一个级别(有时是递归)来完成的将父对象保留在局部变量中。
如果您发现自己在代码中进行了大量深度嵌套的一次性引用,那么您可能希望重新访问代码或数据的结构,因为通常可以避免这种情况。