面向对象的Javascript最佳实践?

我发现自己正在用Javascript编写一个大项目。我记得最后一个是相当冒险,因为黑客JS可以很快变得不可读,我希望这段代码是干净的。

好吧,我使用对象来构造一个库,但在JS中有几种方法来定义东西,这意味着在作用域、内存管理、名称空间等方面的重要结果。例句:

  • 是否使用var;
  • 在文件中定义东西,或者在(function(){...})()中定义jquery样式;
  • 是否使用this;
  • 使用function myname()myname = function();
  • 在对象主体中定义方法或使用“prototype”;
  • 等。

那么,用JS编写面向对象代码的最佳实践是什么呢?

学术上的解释是很有必要的。热烈欢迎链接到书籍,只要他们处理质量和稳健性。

编辑:

有一些阅读资料,但我仍然对上述问题的答案和任何最佳实践非常感兴趣。

58855 次浏览

这里有一本书涵盖了大部分的基础:

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

首先应该阅读基于原型编程,这样你就知道你在处理什么样的野兽,然后看看MDC的JavaScript风格指南MDC的JavaScript页面。我还发现最好使用工具来提高代码质量。JavaScript线头或其他变体。

OO的最佳实践听起来更像是你想要找到模式,而不是专注于代码质量,所以看看谷歌搜索:javascript模式jQuery的模式

是否使用' var '

你应该用var语句引入任何变量,否则它会进入全局作用域。

值得一提的是,在严格模式下("use strict";) 未声明的变量赋值会抛出ReferenceError

目前JavaScript还没有块作用域。Crockford学校教你将var语句放在函数体的开头,而Dojo的风格指南读所有变量都应该在尽可能小的范围内声明。(JavaScript 1.7中引入的let语句和定义不是ECMAScript标准的一部分。)

将经常使用的对象的属性绑定到局部变量是一个很好的实践,因为这比查找整个作用域链要快。(参见优化JavaScript以获得最佳性能和低内存消耗)。

在文件或“(function(){…})()”中定义内容

如果您不需要在代码之外访问对象,您可以将整个代码包装在函数表达式中——这被称为模块模式。它具有性能优势,还允许在较高的级别上简化和模糊代码。您还可以确保它不会污染全局名称空间。JavaScript中的包装函数还允许你添加面向方面的行为。Ben Cherry有一个关于模块模式的深入文章

是否使用“this”

如果你在JavaScript中使用伪经典继承,你很难避免使用this。使用哪种继承模式只是个人喜好的问题。对于其他情况,请查看Peter Michaux关于没有“this”的JavaScript widget的文章。

使用' function myname() '或' myname = function(); '

function myname()是一个函数声明,而myname = function();是赋给变量myname的函数表达式。后一种形式表明函数是一级对象,您可以对它们做任何事情,就像对变量一样。它们之间唯一的区别是所有函数声明都被提升到作用域的顶部,这在某些情况下可能很重要。否则它们是相等的。function foo()是一种速记形式。关于提升的更多细节可以在JavaScript作用域和提升文章中找到。

在对象主体中定义方法或使用“prototype”

由你决定。JavaScript有四种对象创建模式:伪经典模式、原型模式、函数模式和部分模式(Crockford 2008)。每个都有其优点和缺点,参见Crockford的视频演讲或得到他的书好的部分作为Anon已经说过

框架

我建议您选择一些JavaScript框架,研究它们的约定和风格,并找到最适合您的实践和模式。例如,Dojo Toolkit提供了一个健壮的框架来编写面向对象的JavaScript代码,甚至支持多重继承。

模式

最后,有一个专门的博客探索常见的JavaScript模式和反模式。也可以在Stack Overflow中查看问题 JavaScript有编码标准吗?< / >

你可能想看看John Resig (jQuery)的JavaScript忍者的秘密。“本书旨在为中级JavaScript开发人员提供从头开始创建跨浏览器JavaScript库所需的知识。”

草案可通过出版商获得: http://www.manning.com/resig/ < / p > Douglas Crockford在他的主页上也有一些不错的JavaScript文章: http://www.crockford.com/ < / p >

我要写下一些我读到的东西,或者自从我问了这个问题后,我申请的东西。所以读这本书的人不会感到沮丧,因为大多数答案都是RTMF的伪装(即使我必须承认,推荐的书是好的)。

Var使用

在JS中,任何变量都应该已经在较高的范围内声明过。所以当你想要一个新变量时,声明它以避免糟糕的惊喜,比如在不注意它的情况下操纵全局变量。因此,始终使用var关键字。

在对象make中,将变量private设为var。如果你只想声明一个公共变量,可以使用this.my_var = my_value

声明方法

在JS中,有多种方法来声明方法。对于面向对象程序员来说,最自然也是最有效的方法是使用以下语法:

在对象体内部

this.methodName = function(param) {


/* bla */


};

这有一个缺点:内部函数将无法访问“this”,因为滑稽的JS作用域。Douglas Crockford建议使用一个名为“that”的传统局部变量来绕过这个限制。所以它变成了

function MyObject() {


var that = this;


this.myMethod = function() {


jQuery.doSomethingCrazy(that.callbackMethod);


};


};

不靠自动端线吗

如果你忘记;, JS会自动在行尾添加它。不要依赖于这种行为,因为你会得到一堆错误,无法调试。

我经常觉得自己是这里唯一一个使用MooTools来编写javascript的人。

它代表y Object Oriented Tools, mootools。

我真的很喜欢他们在javascript中的面向对象编程。你也可以使用他们的类实现和jquery一起使用,所以你不必抛弃jquery(尽管mootools做的也一样好)。

不管怎样,仔细阅读第一个链接,看看你有什么想法,第二个链接是mootools文档。

MooTools &继承< / >

MooTools Classes