使用Node.js在Javascript中进行OOP编程

我实际上在用Javascript做一个小游戏,我想实现我在http://www.crockford.com/javascript/inheritance.html上find的东西,它类似于:

ZParenizor.method('toString', function () { if (this.getValue()) { return this.uber('toString'); } return "-0-"; }); 

我无法find图书馆用于使这种发展成为可能的任何参考。 有任何想法吗? 否则,我正在寻找一个好的图书馆,这将有助于我的面向对象的开发。

谢谢

编辑:

我正在寻找Node.js的OOP解决scheme/库。 请注意,我是Node.js的新手

两个月后

也许你需要一个库,ES5是地狱,所以我创build了PD

原始答案

我正在寻找Node.js的OOP解决scheme/库。

你不需要一个图书馆。 你有ES5

JavaScript没有经典的OOP。 它有原型OOP。

这意味着你只有对象。 对象可以做的唯一事情就是扩展,操作和克隆它们。

操作

 var o = {}; o.foo = "bar"; 

延伸

 var o = someObject; Object.defineProperties(o, { "foo": { value: "foo" }, "bar": { value: "bar" } "method": { value: function () { } } } 

克隆

 var o = someObject; var p = Object.create(o); 

克隆和扩展

 var o = someObject; var p = Object.create(o, { "foo": { value: "foo" }, "bar": { value: "bar" } "method": { value: function () { } } } 

理解Object.createObject.definePropertyObject.defineProperties如何工作是很重要的。

克隆操作实际上并不克隆。 这是从蓝图创build一个新的对象。 蓝图是一个对象。 它把蓝图放在[[Prototype]][[Prototype]]住在我将用于示范的.__proto__属性中。

 var o = {}; var p = Object.create(o); p.__proto__ === o; // true var q = Object.create(p); q.__proto__.__proto__ === o; var r = Object.create(q); r.__proto__.__proto__.__proto__ === o; 

免责声明: .__proto__已被弃用。 不要在代码中使用它。 它有用于debugging和健全性检查。

这里的主要观点是,从o访问属性,它必须在原型链上走3个级别,这会变得昂贵。 为了解决这个问题,而不是克隆随机对象,你应该克隆特定的蓝图(你应该有一个蓝图)。

 // Parent blueprint var Parent = (function _Parent() { // create blank object var self = Object.create({}); // object logic return self; }()); // factory function var createParent = function _createParent(foo) { // create a object with a Parent prototype return Object.create(Parent, { foo: { value: foo } }); } var Child = (function _Child() { var self = Object.create(Parent); // other stuff return self; }()); var createChild = function _createChild(bar) { return Object.create(Child, { bar: { value: bar } }) }; 

以下是我正在处理的一些代码片段,您可以使用它作为示例:

 var Sketchpad = (function _SketchPad() { var self = Object.create({}); var mousemove = function _mousemove(e) { this.drawLine(e); }; self._init = function _init() { this.$elem.bind({ "mousemove": mousemove.bind(this), }); this.pens = {}; $("#clear").bind("click", this.clear.bind(this)); $("#undo").bind("click", (function _undoPath() { this.pen.undo(); }).bind(this)); return this; }; self.clear = function() { this.paper.clear(); }; return self; }()); createSketch = function _createSketchPad(id, w, h) { var paper = Raphael(id, w, h); var pen = createPen(paper); var o = Object.create(Sketchpad, { paper: { value: paper }, $elem: { value: $("#" + id) }, pen: { get: function() { return pen; }, set: function(v) { pen = v; } } }); return o._init(); }; 

MooTools是OOP Javascript中最好的库之一。

你可以创build类,接口,inheritance等

文档http://mootools.net/docs/core

教程 – MooTools OOP http://www.phpeveryday.com/articles/MooTools-Basic-Creating-Classes-MooTools-P919.html

您可能也对GNU ease.js感兴趣。 如果你对图书馆本身不感兴趣,那么它的手册就会广泛地涉及实现的细节。

您还可以在ECMAScript中查看作者的Classical OOP文章 。

你可以试试Joose, https://github.com/SamuraiJack/Task-Joose-NodeJS 。 尽pipe我个人build议坚持使用ES5提供的Javascript对象function。

在你引用的文章中,他只是给出了一个在JavaScript中inheritance的例子。 他并没有使用框架,而是展示了如何扩展自己写的类。

JavaScript的框架包括Backbone.js (mvc)和MooTools (oop)。

extjs支持使用Ext.defineExt.extend (和Ext.ns )的OOP。 在Sencha.com上看到这个例子

Ext.extend是较老的方法,但仍然有用。 你会做这样的事情:

 Ext.ns('myApp.myPackage'); // create a namespace (function() { // this adds it to the namespace var MyClass = Ext.extend(BaseClass, { property: 1, constructor: function(config) { Ext.apply(this, config); }, method: function(a, b) { this.property = a + b; } }); myApp.myPackage.MyClass = MyClass; }) () 

在Ext 4+中使用Ext.define,你可以这样做:

 Ext.define('myApp.myPackage.MyClass', // don't need to define the namespace first extend: 'BaseClass' // notice the base class is referenced by a string, requires: 'AnotherClass', mixins: { mixin : 'MixinPackage' }, property: 1, constructor: function(config) { //... } method: function(a, b) { this.property = a + b; } }); 

请注意,您也可以在javascript中使用传统的OOP和'new'和function.prototype

如果你想在JavaScript / Node中做一个真正的强大的OOP,你可以看看整个开源框架Danf 。

它允许您在服务器(节点)和客户端(浏览器)两端使用OOP(以及相同的类)。 它还提供了一个很好的dependency injection机制(如果你来自PHP社区,那么看起来就像Symfony2一样)。