我发现自己正在用 Javascript 编写一个大项目。我记得最后一个是相当冒险的,因为 hacky JS 很快就会变得不可读,我希望这段代码是干净的。
好吧,我正在使用对象来构造一个库,但是在 JS 中有几种定义事物的方法,这意味着在范围、内存管理、命名空间等方面的重要后果。例如:
var
(function(){...})()
this
function myname()
myname = function()
那么,在 JS 中使用 OO 进行编码时,真正的最佳实践是什么?
这里真的期待学术解释。热烈欢迎链接到书籍,只要它们涉及质量和稳健性。
编辑 :
阅读了一些资料,但我仍然对上述问题的答案和任何最佳实践非常感兴趣。
您应该在语句中引入任何变量var,否则它会进入全局范围。
值得一提的是,在严格模式 ( "use strict";)中未声明的变量赋值会抛出ReferenceError。
"use strict";
ReferenceError
目前 JavaScript 没有块作用域。Crockford 学派教您将 var 语句放在函数体的开头,而 Dojo 的样式指南则指出所有变量都应在尽可能小的范围内声明。(JavaScript 1.7 中引入的let语句和定义不是 ECMAScript 标准的一部分。)
let
将经常使用的对象的属性绑定到局部变量是一种很好的做法,因为它比查找整个作用域链要快。(请参阅优化 JavaScript 以获得极致性能和低内存消耗。)
如果您不需要访问代码之外的对象,则可以将整个代码包装在一个函数表达式中——这称为模块模式。它具有性能优势,并且还允许您的代码在较高级别上被缩小和模糊。您还可以确保它不会污染全局命名空间。JavaScript 中的包装函数还允许您添加面向方面的行为。Ben Cherry 有一篇关于模块模式的深入文章。
如果你在 JavaScript 中使用伪经典继承,你几乎无法避免使用this. 您使用哪种继承模式是个人喜好问题。对于其他情况,请查看 Peter Michaux 关于JavaScript Widgets without “this”的文章。
myname = function();
function myname()是一个函数声明,myname = function();是一个分配给变量的函数表达式myname。后一种形式表明函数是一等对象,你可以对它们做任何事情,就像对变量一样。它们之间的唯一区别是所有函数声明都被提升到范围的顶部,这在某些情况下可能很重要。否则他们是平等的。function foo()是一种速记形式。关于提升的更多细节可以在JavaScript 范围和提升文章中找到。
myname
function foo()
由你决定。JavaScript 有四种对象创建模式:伪经典、原型、功能和部分(Crockford,2008)。每个都有其优点和缺点,请参阅Crockford 在他的视频谈话中或按照Anon的建议获取他的书 The Good Parts 。
我建议你选择一些 JavaScript 框架,研究它们的约定和风格,并找到最适合你的实践和模式。例如,Dojo Toolkit提供了一个健壮的框架来编写甚至支持多重继承的面向对象的 JavaScript 代码。
最后,还有一个专门探讨常见 JavaScript 模式和反模式的博客。