【发布时间】:2015-12-06 11:10:48
【问题描述】:
我的用例如下:我想创建一个生产各种数据传输对象 (DTO) 的工厂。它们必须易于序列化,并且必须有一些额外的方法。
我当前的实现如下所示 (simplified):
window.Dto = function(type, properties)
{
var
self = this,
values = {},
object = Object.create(self);
properties.forEach(function(prop){
Object.defineProperty(object, prop, {
get: function() { return values[prop]; },
set: function(value) { values[prop] = value; },
enumerable: true
});
});
this.getType = function()
{
return type;
};
this.doSomeMagic = function()
{
// ...
};
return object;
};
// creating a DTO of the Transport.Motorized.Car class
var carObject = new Dto("Transport.Motorized.Car", ["vendor", "model", "color", "vmax", "price"]);
(注意:我不想为这些对象中的每一个创建一个显式类,因为它们有很多,并且它们是从服务器端导出的。此外,您在上面看到的 properties 参数是实际上是带有验证约束等的元数据映射)
我在一个创建了 50,000 个此类对象的循环中进行了快速性能检查。 performance.now() 告诉我它花了超过 1 秒的时间——看起来不错,但不是太令人印象深刻。
我的问题主要是:工厂可以从自己的原型创建一个实例(如果我正确理解该代码的作用)并返回它吗?它会有什么副作用?有没有更好的办法?
【问题讨论】:
-
一般来说,我不会将
new运算符用于工厂函数。相反,我会在函数内部创建一个对象用作原型:您可以使用this,而不是使用var factoryProto = {}; factoryProto.getType = ...; object = Object.create(factoryProto); -
@nils:新创建的对象需要访问
Dto的“私有”成员,因此我无法从外部创建实例。有元数据,例如需要访问元数据的验证函数。在序列化时,我不想看到附加的属性/方法。
标签: javascript prototype ecmascript-5