首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用Node.js在Javascript中进行OOP编程

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

Stack Overflow用户
提问于 2011-06-14 08:25:55
回答 7查看 19.9K关注 0票数 17

我实际上正在使用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新手

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-06-14 14:23:23

2个月后

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

原始答案

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

You‘ta library.你不需要库。你有ES5

JavaScript没有经典的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__已弃用。不要在代码中使用它。不过,它也可以用于调试和健全性检查。

这里的要点是,在r中访问来自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();
};
票数 76
EN

Stack Overflow用户

发布于 2011-06-14 08:34:46

就OOP Javascript而言,MooTools是最好的库之一。

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

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

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

票数 8
EN

Stack Overflow用户

发布于 2014-03-09 03:10:16

您可能还会对GNU ease.js感兴趣。如果你对这个库本身不感兴趣,它的手册中有大量的实现细节。

您还可以查看作者的paper on Classical OOP in ECMAScript

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6337879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档