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