小编典典

面向对象的 Javascript 最佳实践?

all

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

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

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

那么,在 JS 中使用 OO 进行编码时,真正的最佳实践是什么?

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

编辑 :

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


阅读 69

收藏
2022-05-22

共1个答案

小编典典

是否使用 var

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

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

目前 JavaScript 没有块作用域。Crockford 学派教您将 var
语句放在函数体的开头
,而
Dojo
的样式指南则指出所有变量都应在尽可能小的范围内声明。(JavaScript
1.7
中引入的let语句和定义不是
ECMAScript 标准的一部分。)

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

在文件或 (function(){...})() 中定义事物

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

是否使用 this

如果你在 JavaScript 中使用伪经典继承,你几乎无法避免使用this. 您使用哪种继承模式是个人喜好问题。对于其他情况,请查看 Peter
Michaux 关于JavaScript Widgets without
“this”
的文章。

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

function myname()是一个函数声明,myname = function();是一个分配给变量的函数表达式myname。后一种形式表明函数是一等对象,你可以对它们做任何事情,就像对变量一样。它们之间的唯一区别是所有函数声明都被提升到范围的顶部,这在某些情况下可能很重要。否则他们是平等的。function foo()是一种速记形式。关于提升的更多细节可以在JavaScript
范围和提升
文章中找到。

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

由你决定。JavaScript
有四种对象创建模式:伪经典、原型、功能和部分(Crockford,2008)。每个都有其优点和缺点,请参阅Crockford
在他的视频谈话中
或按照Anon的建议获取他的书 The Good Parts

构架

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

模式

最后,还有一个专门探讨常见 JavaScript
模式和反模式
的博客。

2022-05-22