JavaScript – 对象字面量的优点
我读过,而不是简单地写一堆函数,我应该使用对象文字。
有人可以用例子来解释对象文字的优点吗,因为我目前还不明白。
谢谢
正如Russ Cam所说,你避免了污染全局命名空间,这在将多个位置的脚本(TinyMCE等)结合在一起的时候非常重要。
正如亚历克斯·塞克斯顿(Alex Sexton)所说,这也使得代码组织更好。
如果你使用这种技术,我build议使用模块模式。 这仍然使用对象文字,但作为范围函数的返回值:
var MyThingy = (function() { function doSomethingCool() { ... } function internalSomething() { .... } function anotherNiftyThing() { // Note that within the scoping function, functions can // call each other direct. doSomethingCool(); internalSomething(); } return { doSomethingCool: doSomethingCool, anotherNiftyThing: anotherNiftyThing }; })();
外用:
MyThingy.doSomethingCool();
范围函数包装了所有的函数,然后立即调用它并存储它的返回值。 优点:
- 函数被正常声明,因此有名字 。 (尽pipe使用
{name: function() { ... }}
格式,所有的函数都是匿名的,即使引用它们的属性都有名字也是如此)。名称帮助工具可以帮助您在debugging器中显示调用堆栈,告诉你什么function抛出exception。 (2015更新:最新的JavaScript规范,ECMAScript第6版,定义了JavaScript引擎必须推断函数名称的很多方法,其中之一就是当函数被分配给一个属性,就像我们的{name: function() { ... }}
例子,所以当引擎实现ES6时,这个原因将会消失。) - 给你一个只有你的模块使用私有函数的自由(比如我上面的
internalSomething
)。 页面上没有其他代码可以调用这些函数; 他们真的是私人的。 只有最后输出的那个,在return语句中,在范围函数之外是可见的。 - 如果实现只是完全改变(如IE-vs-W3C的东西,或SVG与canvas等),则可以轻松地根据环境返回不同的function。
返回不同function的示例:
var MyUtils = (function() { function hookViaAttach(element, eventName, handler) { element.attachEvent('on' + eventName, handler); } function hookViaListener(element, eventName, handler) { element.addEventListener(eventName, handler, false); } return { hook: window.attachEvent ? hookViaAttach : hookViaListener }; })(); MyUtils.hook(document.getElementById('foo'), 'click', /* handler goes here */);
使用对象字面量(又名对象字面模式)不会像使用全局声明的许多函数那样严重地污染全局命名空间,而且还有助于以逻辑方式组织代码
例如,这个对象文字
var obj = { find : function(elem) { /* find code */ }, doSomething: function() { /* doSomething code */ }, doSomethingElse: function() { /* doSomethingElse code */ } }
相比
function find(elem) { /* find code */ }, function doSomething() { /* doSomething code */ }, function doSomethingElse() { /* doSomethingElse code */ }
将只在全局对象上创build一个属性,而不是三个。 然后你可以很容易地使用像这样的function
obj.doSomething();
Rebecca Murphey在今年的jQuery大会上就Object Literals做了一个演讲。 使用它们的最好的理由之一就是很好的代码组织。
这里是丽贝卡写的对象文字模式: http : //rmurphey.com/blog/2009/10/15/using-objects-to-organize-your-code/
我总是使用对象文字,因为它们是组织代码的一种清晰的方式。 这就是为什么我不喜欢原型,太乱了。
除了对象文字外,函数不会像上面提到的那样对名称空间造成影响。
你可以很容易地写一个像
var obj = {} var find = function(elem) { /* find code */ }, var doSomething = function() { /* doSomething code */ }, var doSomethingElse = function() { /* doSomethingElse code */ }
这将通过创build与function相同的大量全局对象来进行监视。 同样你可以这样做:
(function() { function find(elem) { /* find code */ }, function doSomething() { /* doSomething code */ }, function doSomethingElse() { /* doSomethingElse code */ } })();
这不会创build这些全局对象(一切都是JS中的一个对象)
这样你仍然不会创build大量的全局对象。
在我看来,对象文字有两个好处。 一个他们被许多插件使用,如jQuery,所以人们很有家庭,他们很容易阅读。 让他们轻松将数据传递到插件。 创build公共和私人方法很容易。
它们可能会很慢,但是每次创build对象的实例时,所有的方法都会被重复。 我的理解是,原型不是这样的,因为你有一个方法副本,新的参数只是参考原型。
当然我可能是错的