面向对象的Javascript的最佳做法? [关闭] 面向对象的Javascript的最佳做法?

2019-05-12 15:05发布

我发现自己编码Javascript中的一个大项目。 我记得上一次是相当冒险,因为哈克JS可以迅速变得不可读,我想这个代码是干净的。

好吧,我使用的对象,构成一个lib,但有几种方法来定义JS的东西,在范围内,内存管理,名字空间等EG意味着重要的后果:

  • 使用var与否;
  • 定义在文件中的东西,或在(function(){...})() ,jQuery的风格;
  • 使用this ,与否;
  • 使用function myname()myname = function() ;
  • 限定在所述对象的身体的方法或使用“原型”;
  • 等等

所以JS的OO编码时,什么是真正的最佳做法?

学术解释这里真的期待。 链接到图书热烈欢迎,只要他们在处理质量和可靠性。

编辑:

有一些读数,但我仍然在回答上述问题和任何的最佳做法很感兴趣。

Answer 1:

使用`var`与否

您应该引入与任何变量var语句,否则它会在全球范围内。

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

目前JavaScript没有块范围。 该克罗克福德学校教你怎样把VAR语句在函数体的开始 ,而Dojo的风格指南读取所有的变量应在最小的范围可能被宣布 。 (该let声明和定义在JavaScript 1.7引入的不是ECMAScript标准的一部分)。

这是经常使用的对象的属性绑定到局部变量,因为它是不是找了整个作用域链更快的很好的做法。 (见优化的JavaScript极致的性能和较低的内存消耗 。)

定义在文件中的东西,或在`(函数(){...})()`

如果您并不需要达到你的代码之外你的对象,你可以用你的整个代码的函数表达式 - 这就是所谓的模块模式。 它具有性能优势,又使你的代码进行微细化以及在较高水平模糊。 您也可以确保它不会污染全局命名空间。 包装在JavaScript函数还允许您添加面向方面的行为。 本樱桃有一个对模块模式进行了深入的文章 。

使用`this`与否

如果您在JavaScript中使用伪经典的继承,你很难避免使用this 。 这是您使用哪种遗传模式口味的问题。 对于其他情况,请检查彼得·米肖对文章的JavaScript小部件没有“本” 。

使用`功能MYNAME()`或`MYNAME =函数();`

function myname()是一个函数声明和myname = function(); 是分配给可变的函数表达式myname 。 后一种形式表明函数是第一类对象,你可以与他们做任何事,作为一个变量。 它们之间唯一的区别是,所有的函数声明提升到范围的顶部,这可能在某些情况下无所谓。 否则,他们是平等的。 function foo()是一个速记形式。 在吊装进一步细节可以在中找到的JavaScript作用域和吊装的文章。

定义方法在所述对象的身体或使用“原型”

由你决定。 JavaScript的具有四个对象创建模式:伪古典,原型,功能和零件( 克罗克福德,2008年 )。 每个人都有自己的优缺点,请参阅克罗克福德在他的视频讲座或得到他的书好的部分为匿名已经建议 。

构架

我建议你拿起一些JavaScript框架,研究他们的约定和风格,找到最适合你的这些做法和模式。 例如, 道场工具包提供了一个坚固的框架编写甚至支持多重继承的面向对象的JavaScript代码。

模式

最后,有一个专门为博客探讨共同的JavaScript模式和反模式 。 还检查出的问题是否有任何的JavaScript编码标准? 在堆栈溢出。



Answer 2:

我打算写了一些东西,我读或投入应用,因为我问这个问题。 所以人们阅读也不会感到沮丧,因为大部分的答案是RTMF的伪装(即使我必须承认,建议书是好的)。

是使用

任何变量应该在JS较高的范围是已经声明。 所以,当过你想要一个新的变量,其声明,以避免像操纵全局变量没有注意到它坏的惊喜。 因此,总是使用var关键字。

在一个对象作出,VAR变量私有。 如果你只想声明一个公共变量,使用this.my_var = my_value这样做。

声明方法

在JS,他们宣布方法很多方式。 对于OO程序员,最自然,但有效的方法是使用下面的语法:

对象身体内部

this.methodName = function(param) {

/* bla */

};

有一个缺点:内部功能将无法访问“这个”有趣的JS范围,因为的。 道格拉斯Crockford的建议绕过使用名为“”一个传统的局部变量此限制。 因此,它成为

function MyObject() {

    var that = this;

    this.myMethod = function() {

        jQuery.doSomethingCrazy(that.callbackMethod);

    };

};

不要依赖于行的自动结束

JS会尝试自动添加; 在该行的末尾,如果你忘记它。 不要依赖这种行为,因为你会得到那些乱七八糟的调试错误。



Answer 3:

首先应该阅读有关基于原型的编程 ,所以你知道你正在处理什么样的野兽的脚,然后看看在MDC的JavaScript风格指南和JavaScript页面在MDC 。 我也觉得最好能强制代码质量的工具,即。 JavaScript的林特或其它变体。

像你想找到比模式专注于代码的质量,所以看OO的最佳做法听起来更JavaScript的模式:谷歌搜索和jQuery的模式 。

  • 加快你的JavaScript


Answer 4:

你可能想看看JavaScript的忍者的秘密由John Resig的(jQuery的)。 “这本书的目的是采取中间JavaScript开发,向他提供需要创建一个跨浏览器的JavaScript库的知识,从地面向上。”

可通过发布的草案: http://www.manning.com/resig/

道格拉斯Crockford的也有他的主页一些不错的JavaScript的文章: http://www.crockford.com/



Answer 5:

我常常觉得这里唯一的家伙谁使用MooTools的我的JavaScript。

它代表着M YØØbject工具riented,mootools的。

我真的很喜欢他们在JavaScript中采取的OOP。 您可以使用自己的类实现与jQuery一起,所以你不必沟的jQuery(虽然MooTools的做这一切一样好)。

总之,给第一链路的好读,看看你的想法,第二个环节是MooTools的文档。

MooTools的和继承

MooTools的类



Answer 6:

这里有一本书,涵盖了大部分的依据:

高品质领域应用和库面向对象的Javascript



文章来源: Object Oriented Javascript best practices? [closed]