我开始学习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之后避免构造函数(向下滚动到'事件和回调的关闭'部分);我将创建的每个对象都将使用回调,他的工厂函数解决方案勾选了我的简单框。
答案 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。非常小的陷阱:在每个函数调用的调用堆栈中放置两个函数
这是一个非常小的问题,但每次进行函数调用时,都会在调用堆栈上放置两个函数。
此外,您需要在对象本身而不是对象的原型上定义函数。这不是那么有效,但它是一个小问题 - 特别是因为主要功能体存储在其他地方的单身中。
我实际上甚至不会认为这第三点是一个陷阱,但我仍然这样说。