我有一个非常独特的问题,我不确定我应该如何解决它,是否有解决它的最佳方法,和/或这是否是设计模式缺陷。
问的原因是我相信我不应该为相同的功能重写函数。以下面的示例代码为例;
function Div(config) {
var config = config || {};
this.element = document.createElement("div");
this.setSize(config.width || 0, config.height || 0);
};
Div.prototype.setSize = function(width, height) {
this.setWidth(width);
this.setHeight(height);
};
Div.prototype.setWidth = function(width) {
this.element.style.width = width + "px";
};
Div.prototype.setHeight = function(height) {
this.element.style.height = height + "px";
};
Div.prototype.appendTo = function(element) {
element.appendChild(this.element);
};
你可以看到上面的代码允许我创建div
标签。我可以轻松创建 html div,设置它们的大小并将它们附加到其他元素。
我还有一个Overlay
需要继承的对象Div
。起初我决定设置Div
为Overlay
的原型。
function Overlay(config) {
var config = config || {};
this.setSize(config.width, config.height);
};
Overlay.prototype = new Div();
这工作得很好,但是问题出现了,因为Overlay
它本质上是Div
带有一些附加功能的。由于Overlay
对象Div
的原型是它只指向一个 div 元素,而每个实例都Overlay
应该有自己的 div 元素。
然后我决定做Div
一个财产Overlay
;
function Overlay(config) {
var config = config || {};
this.div = new Div(config);
};
这也可以正常工作,但是现在在创建实例时,Overlay
我必须像这样使用它;
var overlay = new Overlay();
overlay.div.setSize(100, 100);
而不是;
var overlay = new Overlay();
overlay.setSize(100, 100);
为了解决这个问题,我创建了新的原型函数Overlay
来简化使用它,Overlay
因为它现在看起来像这样;
function Overlay(config) {
var config = config || {};
this.div = new Div(config);
};
Overlay.prototype.setSize = function(width, height) {
this.div.setWidth(width);
this.div.setHeight(height);
};
Overlay.prototype.setWidth = function(width) {
this.div.setWidth(width);
};
Overlay.prototype.setHeight = function(height) {
this.div.setHeight(height);
};
Overlay.prototype.appendTo = function(element) {
this.div.appendTo(element);
};
像这样创建Overlay
正是我想要的功能Overlay
,但对我来说这似乎是非常错误的,因为我实际上是为了易于使用而编写函数,并且Div
随着大小可维护性的增长成为真正的痛苦。
虽然设置Div
为Overlay
' 的原型似乎是正确的做事方式,但在我的情况下,它显然不是所有实例Overlay
都绑定到同一个 div 元素。
我怎样才能同时创建一个Div
对象和一个Overlay
对象,在哪里Overlay
有它自己的实例,Div
但也会继承Div
它的原型的所有功能?是否有我应该使用的模式来解决我面临的这个问题?
我真的不知道从哪里开始,但我想我很确定我现在这样做的方式不是正确的方式!
感谢您花时间阅读我的问题。