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


251

我发现自己用Javascript编写了一个大项目。我记得上一篇文章是一次冒险,因为骇客的JS很快就会变得不可读,我希望这段代码是干净的。

好吧,我正在使用对象来构建库,但是有几种方法可以在JS中定义事物,这意味着在范围,内存管理,名称空间等方面都有重要意义。EG:

  • 使用var与否;
  • 在文件中或以(function(){...})()jquery样式定义事物;
  • 是否使用this
  • 使用function myname()myname = function();
  • 在对象主体中定义方法或使用“原型”;
  • 等等

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

这里确实有学术解释。只要能够处理高质量和鲁棒性的书籍,都欢迎链接到这些书籍。

编辑:

得到了一些读物,但我仍然对上述问题的答案和最佳实践非常感兴趣。


2
也许标题中的“面向对象”应替换为“现代”。
viam0Zah 2010年

43
嗯,在答案上有79票赞成,82票赞成,91票赞成...但是由于没有建设性而被关闭...为什么?
Brett Rossier 2012年

1
我编写了一个简单的类,使用简单自然的语法将C ++ OOP功能移植到javascript。在这里查看我的答案:stackoverflow.com/a/18239463/1115652

14
这种类型的问题总是封闭的。我理解其原因,但是由于它们是重要的问题,并且一直很受欢迎(并且由于在遇到类似问题时总是会找到它们),我想知道是否有人可以引导我们到合适的地点询问他们?
KP MacGregor

2
@BrettRossier如果您不使用权力,那么权力有什么用?SO现场演示了民主啄食秩序的运作方式。当然,一些心理学家正在对此进行研究……

Answers:


288

是否使用var

您应该在var语句中引入任何变量,否则它将进入全局范围。

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

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

优良作法是将常规使用的对象的属性绑定到局部变量,因为它比查找整个作用域链要快。(看到优化JavaScript以实现出色的性能和低内存消耗。)

在文件或`(function(){...})()`中定义内容

如果您不需要在代码之外访问对象,则可以将整个代码包装在一个函数表达式中,这称为模块模式。它具有性能上的优势,并且还可以使您的代码最小化并在较高层次上被遮盖。您还可以确保它不会污染全局名称空间。用JavaScript包装函数还允许您添加面向方面的行为。Ben Cherry 在模块模式方面有深入的文章

是否使用“ this”

如果在JavaScript中使用伪古典继承,则几乎无法避免使用 this。使用哪种继承模式都取决于您的口味。对于其他情况,请查看Peter Michaux在JavaScript Widgets上的没有“ this”的文章

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

function myname()是函数声明,myname = function();是分配给variable的函数表达式myname。后一种形式表示函数是一类对象,您可以对它们执行任何操作,例如使用变量。它们之间的唯一区别是所有函数声明都被提升到作用域的顶部,这在某些情况下可能很重要。否则,它们是相等的。function foo()是简写形式。有关起吊的更多详细信息,请参见JavaScript范围和起吊文章。

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

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

构架

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

模式

最后,有一个博客致力于探讨常见的JavaScript模式和反模式。还要检查问题JavaScript是否有任何编码标准?在堆栈溢出中。


1
“ JavaScript具有四种对象创建模式:伪经典,原型,功能和部分”-在此,我将非常感谢您对优缺点进行总结。
BadHorsie 2015年

2
letJavaScript 1.7中引入的语句和定义不属于ECMAScript标准的一部分。” 现在,它是ES6的一部分。
米哈尔Perłakowski

13

自从我问了这个问题之后,我将写下一些我阅读或放入应用程序中的东西。因此,阅读本书的人不会感到沮丧,因为大多数答案都是伪装的RTMF(即使我必须承认,建议的书也不错)。

变量用法

应该在JS的更高范围内声明任何变量。因此,无论何时要使用新变量,都应对其进行声明,以免发生诸如操作全局var而不引起注意之类的意外情况。因此,请始终使用var关键字。

在对象make中,var变量为private。如果只想声明一个公共变量,请使用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会尝试自动添加到该行的末尾。不要依靠这种行为,因为您会得到一些混乱的错误,难以调试。




5

我经常觉得这里是唯一将MooTools用于我的JavaScript的人。

它代表了中号 Ÿ Ø bject Ø riented工具,mootools的。

我真的很喜欢他们用javascript进行OOP。您也可以将其类实现与jquery一起使用,因此您不必抛弃jquery(尽管mootools也可以做到)。

无论如何,请充分阅读第一个链接,看看您的想法,第二个链接是mootools文档。

MooTools与继承

MooTools类别


我不想改变一种语言以使其适合您的旧习惯是一件好事。就像C中的这个人一样,使用#代替使其看起来像fortran,否则。我想你应该努力学习的方式,语言的作品(和它的最佳practicesà,并用它那不打扰你太多的方式,但不能改变它,真的。
E-SATIS

2
我认为MooTools对象系统非常优雅,确实有助于我保持代码的组织/封装。
awesomo

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.