如何从基于对象的语言转移到服务器端Node.js JavaScript的大项目?

我决定习惯于使用Javascript作为我的服务器端(我使用Node.js)语言来设置一个networking服务器,创build服务器deamons和更多。 这是一个相当大的项目,这意味着我必须习惯于语言,并在实际开始避免开销和不必要的麻烦之前让自己达到最佳的设置。

我一直在寻找能够解释大型项目中函数式编程基础知识的源代码。 不幸的是,大多数消息来源只谈到在浏览器中用于简单技巧的基本Javascript。

两个有用的链接,解释了如何在Javascript中创build对象: http://howtonode.org/object-graphs和http://howtonode.org/object-graphs-2 。

最后,创build一个对象似乎是最明智的:

function MyObject(constructorMemberOne, constructorMemberTwo) { this.constructorMemberOne = constructorMemberOne; this.constructorMemberTwo = constructorMembertwo; this.doSomething = function doSomething() { // } } 

现在,我正在寻找一个完整的Javascript语言参考。 到目前为止, https://developer.mozilla.org/en/JavaScript/Reference似乎是最完整的。

Q1:这是推荐的ECMAScript语言参考? 我问的主要是因为它是由一个主要在浏览器行业工作的公司提供的,但是Javascript并不仅仅是浏览器 – 也许有一些我不知道的来源。

其次,我习惯于为每个创build的文件名称代表类的名称创build一个新的文件。 问题2:在JavaScript(V8,Node.js)中这个build议的做法是否也是这样? 如何“导入”这个类?

这个“导入”使我对Node.js的“require”感到困惑。 我知道这是不一样的。 需要基本上加载另一个文件,然后有它自己的命名空间,这意味着它的variables超出了需要这个文件的文件的范围。 然而,对于我的类,我希望有一个方法可用于“导入”类(引号,因为我不确定这是否可能)。 例如。:

 var utils = require("utils/MainUtils.js"); utils.doSomething(); 

据我所知,这个doSomething()方法只有在像下面这样设置时才可用:

 function MainUtils() { exports.doSomething = function doSomething() { // } } 

问题3:对吗? 这不是很不正常?

问题4:是否有任何其他博客或资源有助于我的设置工作,如howtonode.org?

最后,问题5:是否已经努力使大项目的所有这些inheritance,对象创build,项目结构,命名空间等变得更容易? 任何图书馆或为此目的?

希望我的问题很清楚。 任何帮助表示赞赏。 谢谢。

这是推荐的ECMAScript语言参考?

那么官方的ECMAScript语言参考是ECMA-262本身。 但不幸的是,即使是标准文件的标准,这也是完全不可读的。

ECMA不会生成针对最终程序员的任何材料,也没有人认为“最好”的教程。 MDC链接看起来不错,至less。 (大多数JavaScript教程是绝对可怕的,充满了错误,这是JavaScript的错,因为有这么多…古怪的function,但仍然)。

最后,创build一个对象似乎是最明智的:

不幸的是,在JavaScript中没有被广泛接受的“最好”的方法来实现类/实例系统。 很多框架都有自己的系统,或者你可以自己酿造。 您的示例代码为每个对象实例创build每个方法的新实例,与JS本地原型相比,您可能认为这是不理想的。 (通常这种方法在闭包中使用了一个var that= this以避免在callback代码中出现this绑定问题。)您还需要小心如何创build子类并在构造函数中初始化它们。

看到这个问题来讨论JS中类/实例的方法。

我习惯为每个创build的类创build一个新文件

是的,这是一个你不应该给JS的Java疣。

将源文件保存在相关类和函数的可pipe理块中。 有时候,这将是每个文件一个公共类,更多的时候不会。

如何“导入”这个类?

JS本身没有本地导入function。 在浏览器中,你可以通过插入<script>标签或者通过XMLHttpRequest获取代码来完成这个操作,而且必须手工将variables保存在不同的名称空间中。 在Node.js和其他你正在使用CommonJS的地方,你使用模块和require()

那是对的吗?

是。

这不是很不正常?

我不这么认为。 它与其他脚本语言相似,在那里它certificate非常有用。 只有真正的Java迫使你把一个编译单元合并成一个类。

在阅读一本名为“Pro Javascriptdevise模式”的书后,我想出了以下内容。 不过,我被告知,在Javascript中这样想(private,public,static等)是不好的:

 var SomeClass = (function() { this.prototype.publicStaticMember = "this is a public static variable", this.prototype.publicStaticMethod = function() { return "this is a public method: cannot access private members/methods, but can access privileged and public members/methods"; } var privateStaticMember = "this is a private static variable"; function privateStaticMethod() { return "this is a private static method: can only access private members/methods"; } //instance part return function() { this.publicInstanceMember = "this is a public instance variable"; var privateInstanceMember = "this is a private instance variable"; this.publicInstanceMethod = function() { return "this is a privileged method: can access both public and private members/methods"; } var privateInstanceMethod = function() { return "this is a private method: can access both public and private members/methods but is private"; } } })(); 

它会像这样实例化:

 var someInstance = new SomeClass().("param1", "param2"); 

任何意见? 我应该读一本书吗?

如果你还没有,请检查Douglas Crockford的video。 他有很多关于JavaScript原型方面的video。

谷歌为“Douglas Crockford Java编程语言video”。 以下是该系列第一部分的链接: http : //video.yahoo.com/watch/111593/1710507

defineClass npm包提供简单而强大的面向JavaScript的OOP,支持特性(mixin)和嵌套类。 这里是一个使用的例子:

 var defineClass = require("defineClass").defineClass; var Person = defineClass({ cash: 0, constructor: function (firstName, lastName) { this.firstName = firstName; this.lastName = lastName; }, greet: function (name) { console.log("Hello " + name + ". My name is " + this.firstName); }, earn: function (amount) { this.cash += amount; } }); var Developer = defineClass({ _super: Person, // override a field default value cash: 100, // override the constructor constructor: function (firstName, lastName, language) { // you may have code before the base constructor call // call the base constructor this._super(firstName, lastName); this.language = language; } // override a method greet: function (name) { console.log("Hey, " + name + ". I'm " + this.firstName) }, // override a method and call its base method earn: function (amount) { return this._super(amount * 1.2); } }); 

阅读更多的自述: https : //github.com/nodirt/defineClass

安装:

 $ npm install defineClass