首页 文章

面向对象的Javascript最佳实践? [关闭]

提问于
浏览
250

我发现自己用Javascript编写了一个大项目 . 我记得最后一次是冒险,因为hacky JS很快就变得难以理解,我希望这段代码干净利落 .

好吧,我正在使用对象构建一个lib,但有几种方法可以在JS中定义东西,这意味着在范围,内存管理,名称空间等方面会产生重要影响.EG:

  • 使用 var 或不;

  • 定义文件中的内容,或 (function(){...})() ,jquery样式;

  • 使用 this ,或不;

  • 使用 function myname()myname = function() ;

  • 在对象体中定义方法或使用"prototype";

那么在JS中用OO编码时,最佳实践是什么?

学术解释在这里真的很期待 . 链接到书籍热烈欢迎,只要他们处理质量和稳健性 .

编辑:

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

6 回答

  • 286

    使用var或不使用

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

    值得一提的是,在严格模式下( "use strict";undeclared variable assignments throws ReferenceError .

    目前JavaScript没有块范围 . Crockford学校教你put var statements at the beginning of the function body,而Dojo的风格指南读到all variables should be declared in the smallest scope possible . (JavaScript 1.7中引入的let statement and definition不是ECMAScript标准的一部分 . )

    将常规使用的对象属性绑定到局部变量是一种好习惯,因为它比查找整个范围链更快 . (见Optimizing JavaScript for extreme performance and low memory consumption . )

    定义文件中的内容,或者在(function(){...})()中定义

    如果你没有't need to reach your objects outside your code, you can wrap your whole code in a function expression—-it'调用模块模式 . 它具有性能优势,并且还允许您的代码在高级别上缩小和模糊 . 您还可以确保它不会污染全局命名空间 . Wrapping Functions in JavaScript还允许您添加面向方面的行为 . Ben Cherry有一个in-depth article on module pattern .

    使用this或不使用

    如果在JavaScript中使用伪经典继承,则很难避免使用 this . 它's a matter of taste which inheritance pattern you use. For other cases, check Peter Michaux'的文章JavaScript Widgets Without "this" .

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

    function myname() 是函数声明, myname = function(); 是分配给变量 myname 的函数表达式 . 后一种形式表明函数是第一类对象,你可以对它们做任何事情,就像变量一样 . 它们之间的唯一区别是所有函数声明都被提升到范围的顶部,这在某些情况下可能很重要 . 否则他们是平等的 . function foo() 是一种速记形式 . 有关吊装的更多详细信息,请参阅JavaScript Scoping and Hoisting文章 .

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

    由你决定 . JavaScript有四种对象创建模式:伪古典,原型,功能和部分(Crockford, 2008) . 每个都有其优点和缺点,请参阅Crockford in his video talks或将他的书作为Anon already suggested获取 .

    框架

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

    模式

    最后,有一个致力于explore common JavaScript patterns and anti-patterns的博客 . 另请查看Stack Overflow中的问题Are there any coding standards for JavaScript? .

  • 13

    自从我问这个问题以来,我将写下我阅读或提交的一些内容 . 因此阅读它的人不会感到沮丧,因为大多数答案都是RTMF的伪装(即使我必须承认,建议的书很好) .

    Var用法

    任何变量都应该在JS的较高范围内声明 . 因此,当您需要一个新变量时,请声明它以避免在不注意它的情况下操纵全局变量等意外情况 . Therefore, always use the var keyword.

    在对象make中,将变量设为var . 如果您只想声明一个公共变量,请使用 this.my_var = my_value 来执行此操作 .

    声明方法

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

    在物体内部

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

    有一个缺点:由于有趣的JS范围,内部函数将无法访问“this” . Douglas Crockford建议使用名为“that”的传统局部变量来绕过此限制 . 所以它变成了

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

    不要依赖自动结束

    如果你忘了它,JS会尝试在行尾自动添加 ; . 唐't rely on this behavior, as you'将获得调试混乱的错误 .

  • 5

    首先应该阅读prototype-based programming,以便你知道你正在处理什么样的野兽,然后看看JavaScript style guide at MDCJavaScript page at MDC . 我也发现最好用工具强制代码质量,即 . JavaScript Lint或其他变种 .

    OO的最佳实践听起来更像是想要找到模式而不是专注于代码质量,所以请查看Google search: javascript patternsjQuery patterns .

  • 5

    您可能想查看John Resig(jQuery)的Secrets of the JavaScript Ninja . "This book is intended to take an intermediate JavaScript developer and give him the knowledge he needs to create a cross-browser JavaScript library, from the ground, up."

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

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

  • 0

    我经常觉得这里唯一一个使用MooTools为我的javascript的人 .

    它代表 M y O bject O riented Tools,mootools .

    我真的很喜欢他们在javascript中对OOP的看法 . 您也可以将它们的类实现与jquery一起使用,因此您不必抛弃jquery(尽管mootools也是如此) .

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

    MooTools & Inheritance

    MooTools Classes

  • 8

相关问题