面向对象的Javascript最佳实践?

我发现自己在Javascript中编写了一个大项目。 我记得最后一个是相当的冒险,因为哈克JS可以很快变得不可读,我想这个代码是干净的。

那么,我正在使用对象来构造一个库,但有几种方法来定义JS中的东西,这意味着在范围,内存pipe理,名称空间等重要的后果。EG:

  • 使用var或不;
  • 在文件中定义或者在(function(){...})() ,jquery风格中定义;
  • 使用this ,还是不行;
  • 使用function myname()myname = function() ;
  • 定义对象主体中的方法或使用“原型”;
  • 等等

那么在JS的面向对象编程中,真正的最佳实践是什么?

学术解释真的在这里。 链接到书籍热烈欢迎,只要他们处理质量和鲁棒性。

编辑:

有一些阅读,但我仍然非常有兴趣回答上述问题和任何最佳做法。

使用var或不

您应该使用var语句引入任何variables,否则它将进入全局范围。

值得一提的是,在严格模式下( "use strict"; ), 未声明的variables赋值会引发ReferenceError

目前JavaScript没有块范围。 克罗克福德学派教你在函数体的开头部署var语句 ,而Dojo的“样式指南”则指出所有的variables都应该在尽可能小的范围内声明 。 (JavaScript 1.7中引入的let语句和定义不是ECMAScript标准的一部分。)

将常规使用的对象的属性绑定到局部variables是一个好习惯,因为它比查找整个作用域链更快。 (请参阅优化JavaScript以获得极高的性能和低内存消耗 。)

在文件中定义或者在((function(){…})()`中定义

如果您不需要在代码之外访问对象,则可以将整个代码包装在函数expression式中 – 称为模块模式。 它具有性能优势,还可以让您的代码在高层次上被缩小和遮蔽。 你也可以确保它不会污染全局命名空间。 JavaScript中的封装函数也允许您添加面向方面的行为。 Ben Cherry有一篇关于模块模式的深度文章 。

是否使用`this`

如果你在JavaScript中使用伪古典inheritance,你很难避免使用this 。 这是你使用的inheritance模式的味道问题。 对于其他情况,请查阅Peter Michaux关于JavaScript Widgets的文章。

使用`函数myname()`或`myname = function();`

function myname()是一个函数声明, myname = function(); 是分配给variablesmyname的函数expression式。 后一种forms表示函数是第一类对象,你可以对它们做任何事情,就像variables一样。 它们之间的唯一区别是,所有的函数声明都被提升到范围的顶部,这在某些情况下可能很重要。 否则他们是平等的。 function foo()是一个简写forms。 有关提升的更多细节,请参阅JavaScript范围和提升文章。

在对象的主体中定义方法或使用“原型”

随你便。 JavaScript有四种对象创build模式:伪古典,原型,function和部分( Crockford,2008 )。 每个人都有自己的优点和缺点,请参阅克罗克福德的video讲座,或拿到他的书“好部分”作为阿农已经build议 。

构架

我build议你select一些JavaScript框架,研究它们的约定和风格,find最适合你的实践和模式。 例如, Dojo工具包提供了一个强大的框架来编写面向对象的JavaScript代码,甚至支持多inheritance。

模式

最后,有一个博客致力于探索常见的JavaScript模式和反模式 。 还检查了这个问题是否有JavaScript的编码标准? 在堆栈溢出。

自从我提出这个问题以后,我将会写下一些我阅读或者提交的东西。 所以读书的人不会感到沮丧,因为大部分答案都是伪装的(即使我必须承认,build议的书是好的)。

Var使用情况

任何variables都应该已经在JS中更高的范围声明了。 所以,当你想要一个新的variables时,声明它以避免不必要的操作全局variables。 因此,请始终使用var关键字。

在一个对象make中,varvariablesprivate。 如果你只想声明一个公共variables,使用this.my_var = my_value来这样做。

声明方法

在JS中,它们是多种方式的声明方法。 对于OO程序员来说,最自然而有效的方法是使用下面的语法:

在物体内部

 this.methodName = function(param) { /* bla */ }; 

有一个缺点:由于有趣的JS范围,内部函数将无法访问“this”。 道格拉斯·克罗克福德(Douglas Crockford)build议使用名为“that”的常规局部variables绕过这个限制。 所以它成为

 function MyObject() { var that = this; this.myMethod = function() { jQuery.doSomethingCrazy(that.callbackMethod); }; }; 

不要依靠自动行结束

JS试图自动添加; 在行尾如果你忘了它。 不要依赖这种行为,因为你会得到一个乱七八糟的debugging错误。

首先应该了解基于原型的编程,以便了解您正在处理的是什么types的野兽,然后查看MDC的JavaScript风格指南和MDC的 JavaScript页面 。 我也发现最好用一个工具强制代码质量,即。 JavaScript Lint或其他变体。

OO的最佳实践听起来更像是想要find模式,而不是专注于代码质量,所以看看Googlesearch:JavaScript模式和jQuery模式 。

  • 加快你的JavaScript

您可能想要通过John Resig(jQuery)查看JavaScript忍者的秘密 。 “这本书是为了让一个中级的JavaScript开发人员,给他他从创build一个跨浏览器JavaScript库所需的知识。”

草案可通过发布者获得: http : //www.manning.com/resig/

道格拉斯·克罗克福德在他的主页上也有一些不错的JavaScript文章: http : //www.crockford.com/

我经常觉得这里是唯一一个使用MooTools为我的JavaScript的人。

它代表了我的主要工具,摩托车。

我真的很喜欢他们在JavaScript中的OOP。 你也可以使用他们的类实现和jquery一样,所以你不必去掉jquery(尽pipemootools也是这样做的)。

无论如何,给第一个链接一个很好的阅读,看看你的想法,第二个链接是对mootools文档。

MooTools与inheritance

MooTools类

这是一本涵盖大部分基础的书:

面向对象的Javascript高品质的应用程序和库