TL;博士:
我们是否需要原型 OO 中的工厂/构造函数?我们可以进行范式转换并完全放弃它们吗?
幕后故事:
最近我一直在玩弄用 JavaScript 做原型 OO,发现用 JavaScript 完成的 99% 的 OO 都在强制使用经典的 OO 模式。
我对原型 OO 的看法是它涉及两件事。方法(和静态数据)的静态原型和数据绑定。我们不需要工厂或构造函数。
在 JavaScript 中,这些是包含函数和Object.create
.
这意味着我们可以将所有内容建模为静态蓝图/原型和数据绑定抽象,最好直接连接到文档样式的数据库中。即对象从数据库中取出,并通过使用数据克隆原型来创建。这意味着没有构造函数逻辑,没有工厂,没有new
.
示例代码:
一个伪示例是:
var Entity = Object.create(EventEmitter, {
addComponent: {
value: function _addComponent(component) {
if (this[component.type] !== undefined) {
this.removeComponent(this[component.type]);
}
_.each(_.functions(component), (function _bind(f) {
component[f] = component[f].bind(this);
}).bind(this));
component.bindEvents();
Object.defineProperty(this, component.type, {
value: component,
configurable: true
});
this.emit("component:add", this, component);
}
},
removeComponent: {
value: function _removeComponent(component) {
component = component.type || component;
delete this[component];
this.emit("component:remove", this, component);
}
}
}
var entity = Object.create(Entity, toProperties(jsonStore.get(id)))
小解释:
特定的代码很冗长,因为 ES5 很冗长。Entity
上面是一个蓝图/原型。任何带有数据的实际对象都将使用Object.create(Entity, {...})
.
实际数据(在本例中为组件)直接从 JSON 存储加载并直接注入到Object.create
调用中。当然,类似的模式也适用于创建组件,只有通过Object.hasOwnProperty
的属性才会存储在数据库中。
第一次创建实体时,它是用空的{}
实际问题:
现在我的实际问题是
- JS原型OO的开源例子?
- 这是一个好主意吗?
- 它是否符合原型 OOP 背后的想法和概念?
- 不使用任何构造函数/工厂函数会在某处咬我吗?我们真的可以不使用构造函数吗?使用上述方法是否有任何限制,我们需要工厂来克服它们。