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

2022-08-30 00:33:45

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

好吧,我正在使用对象来构造一个lib,但是有几种方法可以在JS中定义事物,这意味着在范围,内存管理,名称空间等方面的重要后果。例如:

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

那么在JS中以OO编码的最佳实践是什么?

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

编辑:

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


答案 1

是否使用“var”

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

值得一提的是,在严格模式 () 中,未声明的变量赋值会引发 ReferenceError"use strict";

目前JavaScript没有块范围。Crockford学校教你把var语句放在函数体的开头,而Dojo的风格指南则规定所有变量都应该在尽可能小的范围内声明。(JavaScript 1.7 中引入的 let 语句和定义不是 ECMAScript 标准的一部分。

将常规使用的对象的属性绑定到局部变量是一种很好的做法,因为它比查找整个作用域链更快。(请参阅优化 JavaScript 以实现极致性能和低内存消耗

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

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

是否使用“this”

如果你在 JavaScript 中使用伪经典继承,你很难避免使用 .这是您使用哪种继承模式的品味问题。对于其他情况,请查看Peter Michaux关于JavaScript Widgets的文章,没有“this”。this

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

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

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

这取决于你。JavaScript有四种对象创建模式:伪经典,原型,函数式和部分(Crockford,2008)。每个都有其优点和缺点,请参阅Crockford的视频演讲或获得他的书The Good Parts as Anon已经建议。

框架

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

模式

最后,有一个博客致力于探索常见的JavaScript模式和反模式。另请查看问题 在 Stack Overflow 中 JavaScript 是否有任何编码标准?


答案 2

我将写下一些我阅读或应用的东西,因为我问了这个问题。因此,阅读它的人不会感到沮丧,因为大多数答案都是伪装的RTMF(即使我必须承认,建议的书都很好)。

变量用法

任何变量都应该已经在JS的更高范围内声明。因此,当您想要一个新变量时,请声明它以避免糟糕的意外,例如在不注意到它的情况下操作全局变量。因此,请始终使用 var 关键字。

在对象 make 中,var 变量 private。如果只想声明公共变量,请使用。this.my_var = my_value

声明方法

在JS中,它们是许多声明方法的方法。对于 OO 程序员来说,最自然但最有效的方法是使用以下语法:

对象正文内部

this.methodName = function(param) {

/* bla */

};

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

function MyObject() {

    var that = this;

    this.myMethod = function() {

        jQuery.doSomethingCrazy(that.callbackMethod);

    };

};

不依赖自动下线

如果您忘记了,JS会尝试在行尾自动添加。不要依赖此行为,因为您将收到调试起来一团糟的错误。;