2011-05-02 92 views
5

我想将JavaScript对象的创建与正在使用它的代码分离开来,以便我可以灵活地将具有相同签名的其他对象实现替换为一个对象实现,而无需触及大部分代码。为了实现这个,我想出了Repository和Factory Method创建对象的概念。下面是执行:JavaScript中的工厂模式

//The Factory Method 
function ObjectFactory() {} 
ObjectFactory.create = function (o) { 
    var args = [].slice.call(arguments, 1); 

    function F() {} 
    F.prototype = o.prototype; 
    var instance = new F(); 
    o.apply(instance, args); 
    return instance; 
}; 

//The Repository 
var Repository = { 
    'invitation': Invitation, 
    'message': Message 
}; 

//Usage 
var inv = ObjectFactory.create(Repository["invitation"], "invitation", "invitation body", "Sender"); 
var msg = ObjectFactory.create(Repository["message"], "message", "message body"); 
var inv2 = ObjectFactory.create(Repository["invitation"], "invitation2", "invitation body2", "Sender"); 

这种模式为我工作,但我继续前进,实现这个代码在我的项目,我想知道以前是否有任何缺陷(模式的失败来创建对象,性能瓶颈 - 如果我将使用这种方法创建5-10到200行到1000行代码的对象)。我在长时间处理服务器端代码后返回JavaScript,因此我对自己的解决方案并不十分自信。另外,我可以使用ES5 Object.create,但客户现在只能使用IE8和FF3.6浏览器。

感谢

回答

2

只需使用Object.create()与ES5垫片像这样一起:https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js

它做你最想要什么,以及做事情的时候,实际上成为标准的ES5方式。考虑到使用一个对象作为另一个对象的原型的常见情况,它在所有浏览器中都能正常工作。

+0

我不知道这个图书馆。感谢您指出。 – Navneet 2011-05-03 01:09:00