这个javascript模式好吗?

时间:2014-05-28 19:00:35

标签: javascript closures prototypal-inheritance

我开始学习JS,我试图避免使用新的'和'这个'并找到了我使用工厂功能模式的首选方法。缺点是实例化新对象会增加开销,因为每个实例都会复制每个方法。

然后我将每个方法提取到另一个对象中,这样我就可以使用差异原型继承,即每个方法只存在一次,并且调用函数引用这个新对象;这样我就拥有数据持久性和原型继承可扩展性。

这种模式是否有任何陷阱?

var square = function(name) {
    var data = { 'x1': 0, 'x2': 10, 'y1': 0, 'y2':10 };
    return {
        draw : function(){ square.methods.draw(data); }
    };
};

square.methods = {
    draw : function(data) { doStuff }
};

//usage
var newSquare = square('xyz');
newSquare.draw();

编辑:

感谢所有的快速回复,我衷心感谢所有的帮助。我接受了Bergi的回答,因为它反映了我想要做的事情;我想我必须把它吸干然后用这个' ;)

编辑2:

我试图在阅读this之后避免构造函数(向下滚动到'事件和回调的关闭'部分);我将创建的每个对象都将使用回调,他的工厂函数解决方案勾选了我的简单框。

2 个答案:

答案 0 :(得分:2)

  

这种模式是否有任何陷阱?

嗯,您已经将其命名为:" 每个实例都复制了每个方法"。

  

我试图避免使用' new'和'这个'

除非你不了解它们是如何工作的,否则没有充分的理由这样做。 Is JavaScript's "new" keyword considered harmful?

使用默认的构造函数模式:

function Square(name) {
    this.data = { 'x1': 0, 'x2': 10, 'y1': 0, 'y2':10 };
}
Square.prototype.draw = function(){ /* doStuff with `this.data` */ };

//usage
var newSquare = new Square('xyz');
newSquare.draw();

如果您想使用工厂模式,您仍然可以使用原型继承:

function square(name) {
    var instance = Object.create(square.methods);
    instance.data = { 'x1': 0, 'x2': 10, 'y1': 0, 'y2':10 };
    return instance;
};

square.methods = {
    draw: function(){ /* doStuff with `this.data` */ };
};

//usage
var newSquare = square('xyz');
newSquare.draw();

但是,这种模式使继承变得相当复杂。

答案 1 :(得分:0)

我想在已经说过的内容中添加一些额外的陷阱:

<强> 1。使代码的维护更加困难。

例如,如果重命名绘图功能,则必须在三个位置而不是一个位置更改它。

定义方法也比平常多一点。

<强> 2。使用instanceof

您无法使用instanceof。例如,在上面的代码中尝试执行此操作:

newSquare instanceof square

返回false。

第3。非常小的陷阱:在每个函数调用的调用堆栈中放置两个函数

这是一个非常小的问题,但每次进行函数调用时,都会在调用堆栈上放置两个函数。

此外,您需要在对象本身而不是对象的原型上定义函数。这不是那么有效,但它是一个小问题 - 特别是因为主要功能体存储在其他地方的单身中。

我实际上甚至不会认为这第三点是一个陷阱,但我仍然这样说。