【问题标题】:OOP Programming in Javascript with Node.js使用 Node.js 在 Javascript 中进行 OOP 编程
【发布时间】:2011-06-14 00:25:54
【问题描述】:

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

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

我找不到用于使此类开发成为可能的库的任何参考。有任何想法吗?否则,我正在寻找一个可以帮助我开发 OOP 的优秀库。

谢谢

编辑:

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

【问题讨论】:

  • Crockford 是 JavaScript 参考的好人。你已经有了一个好的开始。
  • 更具体一点,我正在使用 Node.js,我不需要提供 DOM 操作、效果、ajax 等的整个库......
  • 还可以查看this answer 以了解使用 JS 的出色对象构造/继承。干杯!

标签: oop node.js


【解决方案1】:

2 个月后

也许你确实需要一个库,ES5 非常冗长,所以我创建了pd

原答案

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

不需要库。你有 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 的工作原理非常重要。

克隆操作实际上并不是克隆。它正在从蓝图创建一个新对象。蓝图是一个对象。它将蓝图放在[[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__ 已弃用。不要在代码中使用它。不过,它可用于调试和完整性检查。

这里的要点是,从o 访问r 中的属性必须沿着原型链向上走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 }
  })
};

这是我正在处理的一些代码中的一个 sn-p,您可以将其用作示例:

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();
};

【讨论】:

  • 这就是我加入 Stack Overflow 的原因。 +1
【解决方案2】:

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

可以创建类、接口、使用继承等

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

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

【讨论】:

  • 我非常喜欢教程链接。我确实在为 OOP 方面寻找类似于 Mootools 的东西。事实上,我在玩 Node.js,我怀疑我是否需要整个库(Mootools)。
  • 有客户端框架。 MooTools 在服务器上没用。
  • 苛刻的是,我在 问题被编辑以指定服务器端 js... :(
  • 是的,很苛刻,反正现在有nodejs版本了:github.com/vsviridov/mootools-node
【解决方案3】:

您可能还对GNU ease.js 感兴趣。如果您对库本身不感兴趣,它的手册会详细介绍实现细节。

你也可以看到作者的paper on Classical OOP in ECMAScript

【讨论】:

    【解决方案4】:

    你可以试试 Joose,https://github.com/SamuraiJack/Task-Joose-NodeJS。不过,我个人建议坚持使用 ES5 提供的 Javascript 的对象功能。

    【讨论】:

      【解决方案5】:

      在您引用的文章中,他只是举例说明了 javascript 中继承的可能性。他没有使用框架,而是向您展示如何扩展您自己编写的类。

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

      【讨论】:

      • 哦,那我希望他能给出一个完整的例子。用他的例子来理解他(Crockford)“做”的方式看起来很容易。
      • MooTools 是一个客户端框架。我避免在服务器上使用它。 Backbone 是一个很棒的服务器端 MVC 包装器。
      • 发布此评论时,Cybrix 并不清楚他是否希望将其放在服务器上。
      【解决方案6】:

      extjs 支持带有 Ext.defineExt.extend(以及 Ext.ns)的 OOP。请参阅 Sencha.com 上的this example

      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;
          }
      });
      

      请注意,您也可以将传统的 OOP in javascript 与 'new' 和 function.prototype 一起使用

      【讨论】:

        【解决方案7】:

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

        它允许您在服务器(节点)和客户端(浏览器)端使用 OOP(以及相同的类)。 它还提供了一个很好的依赖注入机制(如果您来自 PHP 社区,则可以看作 Symfony2 的一种)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-29
          • 1970-01-01
          相关资源
          最近更新 更多