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

Cyb*_*rix 17 oop node.js

我实际上正在玩Javascript做一个小游戏,我想实现我在http://www.crockford.com/javascript/inheritance.html上找到的类似于:

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

我找不到任何用于使这种开发成为可能的库的参考.有任何想法吗?否则,我正在寻找一个有助于我的OOP发展的好图书馆.

谢谢

编辑:

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

Ray*_*nos 77

两个月后

也许你确实需要一个库,ES5很详细,所以我创建了pd

原始答案

我正在寻找Node.js的OOP解决方案/库.

并不需要一个库.你有ES5.

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

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

操纵

var o = {};
o.foo = "bar";
Run Code Online (Sandbox Code Playgroud)

延伸

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

克隆

var o = someObject;
var p = Object.create(o);
Run Code Online (Sandbox Code Playgroud)

克隆并扩展

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

要了解这一点很重要Object.create,Object.definePropertyObject.defineProperties工作.

克隆操作实际上并不是克隆.它正在从蓝图中创建一个新对象.蓝图是一个对象.它把蓝图放在了[[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;
Run Code Online (Sandbox Code Playgroud)

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

这里主要的一点是,从访问属性or它必须走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 }
  })
};
Run Code Online (Sandbox Code Playgroud)

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

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();
};
Run Code Online (Sandbox Code Playgroud)

  • 这就是我加入Stack Overflow的原因.+1 (5认同)

Col*_*lin 8

MooTools是OOP Javascript方面最好的库之一.

您可以创建类,接口,使用继承等.

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

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


小智 5

您可能也对GNU ease.js感兴趣.如果您对库本身不感兴趣,那么它的手册会广泛地介绍实现细节.

您还可以在ECMAScript中看到作者关于Classical OOP论文.