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

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

是否使用var; 在文件中定义东西,或者在(function(){…})()中定义东西,jquery风格; 用不用这个; 使用函数myname()或myname = function(); 在对象主体中定义方法或使用“prototype”; 等。

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

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

编辑:

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


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

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


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

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

加快你的JavaScript


是否使用' var '

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

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

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

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

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

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

是否使用“this”

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

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

function myname() is a function declaration and myname = function(); is a function expression assigned to variable myname. The latter form indicates that functions are first-class objects, and you can do anything with them, as with a variable. The only difference between them is that all function declarations are hoisted to the top of the scope, which may matter in certain cases. Otherwise they are equal. function foo() is a shorthand form. Further details on hoisting can be found in the JavaScript Scoping and Hoisting article.

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

由你决定。JavaScript有四种对象创建模式:伪经典模式、原型模式、函数模式和部分模式(Crockford, 2008)。每一种都有其优点和缺点,看看Crockford的视频演讲,或者像Anon已经建议的那样买他的书《The Good Parts》。

框架

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

模式

最后,有一个博客专门探讨常见的JavaScript模式和反模式。还可以查看“JavaScript有编码标准吗?”在Stack Overflow。


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

该草案可通过出版商获得: http://www.manning.com/resig/

Douglas Crockford在他的主页上也有一些不错的JavaScript文章: http://www.crockford.com/


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

变量用法

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

在对象make中,将变量private设为var。如果你只想声明一个公共变量,使用这个。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的人。

它代表我的面向对象的工具,mootools。

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

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

塑造与内在

MooTools类