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

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

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

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

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

编辑:

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


当前回答

我要写下一些我读到的东西,或者自从我问了这个问题后,我申请的东西。所以读这本书的人不会感到沮丧,因为大多数答案都是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尝试自动添加;如果你忘记了,就在这条线的尽头。不要依赖于这种行为,因为你会得到一堆错误,无法调试。

其他回答

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

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

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

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

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

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

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

塑造与内在

MooTools类

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

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

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

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

加快你的JavaScript

我要写下一些我读到的东西,或者自从我问了这个问题后,我申请的东西。所以读这本书的人不会感到沮丧,因为大多数答案都是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尝试自动添加;如果你忘记了,就在这条线的尽头。不要依赖于这种行为,因为你会得到一堆错误,无法调试。