【发布时间】:2014-10-01 20:24:45
【问题描述】:
如果可以选择以一种或另一种方式设计事物,通常是更好的(通过性能、可维护性、可读性、功能等...)进行函数链接或使用对象属性访问器进行分层访问,为什么?
它是完全取决于用例,还是一般来说更好?
例子:
var foo = bar.get('parent').get('child').get('grandChild')...
// vs
var foo = bar['parent']['child']['grandChild']...
// or
var foo = bar.parent.child.grandChild...
或者有更好的方法吗?
请注意,点符号 . 可能并不总是可行的,因为源缩小、使用的属性值不是有效的 JavaScript 标识符等。
编辑:
既然太笼统了,那来个更具体的例子呢……
考虑以下...
var animals = {
dogs: {
'Chloe': {
name: 'Chloe',
fetch: function() {},
rollover: function() {},
pups: {
'Charlie': {
name: 'Charlie',
fetch: function() {},
rollover: function() {}
},
'Lily': {
//...
}
}
},
'Toby': {
//...
}
},
cats: {
'Fido': {
name: 'Fido',
meow: function() {},
kittens: {
'Mia': {
name: 'Mia',
meow: function() {}
},
'Shadow': {
//...
}
}
}
}
}
请注意,这是一种显示层次结构的尝试,并没有显示任何原型继承,尽管它可能存在(并且可能会出现在示例中)。
在如图所示的层次结构中,可以使用属性访问来获取特定的 pup,如下所示
var myPup = animals.dogs['Chloe'].pups['Charlie'];
// or
var myPup = animals.dogs.Chloe.pups.Charlie;
// or
var myPup = animals['dogs']['Chloe']['pups']['Charlie'];
这是理想的吗?或者使用函数访问小狗是否有显着的好处
var myPup = animals.dogs('Chloe').pups('Charlie');
【问题讨论】:
-
我想说第二个更干净,你没有真正增加任何价值的“get”。但我认为这在很大程度上是一个偏好问题。
-
调用函数(可能)比不调用函数更昂贵。使用像这样的显式 getter 函数也不是 JavaScript 惯用的。
-
后两个是already answered。第一个没有可比性。
-
是的。它确实完全取决于用例。你到底想做什么?因为您的第一个示例不是该模式的引人注目的用例。
-
@NanoWizard 您的论点确实与问题无关。如果你的函数返回对象本身,你也没有理由不能做
animals['Chloe'].fetch().pups['Charlie'].rollover();。
标签: javascript function object