ООП программирование в Javascript с Node.js - PullRequest
17 голосов
/ 14 июня 2011

Я на самом деле играю с Javascript, делая небольшую игру, и я хотел бы реализовать то, что я нашел на http://www.crockford.com/javascript/inheritance.html, что-то вроде:

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

Я не могу найти какую-либо ссылку на библиотеку, использовавшуюся для такой разработки. Есть идеи? В противном случае, я ищу хорошую библиотеку, которая поможет моим разработкам ООП.

Спасибо

Edit:

Я ищу решение / библиотеку ООП для Node.js. Обратите внимание, что я новичок в Node.js

Ответы [ 7 ]

77 голосов
/ 14 июня 2011

2 месяца спустя

Возможно, вам нужна библиотека, ES5 многословен, как черт, поэтому я создал pd

Оригинальный ответ

Я ищу решение / библиотеку ООП для Node.js.

Вам не нужна библиотека.У вас ES5 .

JavaScript не имеет классического ООП.Он имеет прототип ООП.

Это означает, что у вас есть только объекты.Единственное, что вы можете делать с объектами, это расширять, манипулировать и клонировать их.

Манипулировать

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.create, Object.defineProperty и Object.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 }
  })
};

Вот фрагмент кода, над которым я работаю, который вы можете использоватькак пример:

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();
};
8 голосов
/ 14 июня 2011

MooTools - одна из лучших библиотек с точки зрения ООП Javascript.

Вы можете создавать классы, интерфейсы, использовать наследование и т. Д.

Документация http://mootools.net/docs/core

Учебное пособие - MooTools OOP http://www.phpeveryday.com/articles/MooTools-Basic-Creating-Classes-MooTools-P919.html

5 голосов
/ 08 марта 2014

Вас также может заинтересовать GNU ease.js .Если вас не интересует сама библиотека, ее руководство подробно описывает детали реализации.

Вы также можете ознакомиться с авторской статьей о классическом ООП в ECMAScript .

3 голосов
/ 14 июня 2011

Вы можете попробовать Joose, https://github.com/SamuraiJack/Task-Joose-NodeJS. Хотя я лично рекомендую придерживаться функциональности объектов Javascript, предоставляемой ES5.

2 голосов
/ 14 июня 2011

В статье, на которую вы ссылались, он просто приводил пример того, что было возможно с наследованием в javascript. Он не использовал фреймворк, но показал вам, как расширить свои собственные классы, которые вы написали.

Каркасы для JavaScript включают Backbone.js (mvc) и MooTools (oop).

1 голос
/ 25 ноября 2014

Если вы хотите сделать действительно сильный ООП в Javascript / Node, вы можете взглянуть на полнофункциональную среду с открытым исходным кодом(и так же классы) на стороне сервера (узла) и клиента (браузера).Он также предоставляет удобный механизм внедрения зависимостей (похожий на Symfony2, если вы из сообщества PHP).

1 голос
/ 09 мая 2012

extjs поддерживает OOP с Ext.define и Ext.extend Ext.ns ).См. этот пример на 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.define в Ext 4+ вы можете сделать:

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 в JavaScript с новым и function.prototype

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...