我试图找到一种方法来避免在类的原型上创建大量的passthrough方法。我有一个ProgressBar类,它有很多实例方法。我想创建一个新类(在我的代码示例中称为ComposedProgressBar),它“具有”progressBar实例,并且不从ProgressBar继承。
为了从客户端代码访问progressBar的实例方法,通常会创建一系列passthrough函数。如:
ComposedProgressBar.prototype.setWidth = function (width) {
this.progressBar.setWidth(width);
};
但是,我试图避免这种情况。
我可以通过将以下内容添加到ComposedProgressBar的构造函数来访问progressBar的特权方法:
ProgressBar.call(this);
但是,这不适合我正在尝试实施的内容。我需要访问已添加到ProgressBar原型的方法。
以下是基于我目前正在使用的示例代码。我已经包含了高度设置器和getter,只是为了说明使用ProgressBar.call(this)适用于它们。
有可能做我想要实现的目标吗?
function ProgressBar() {
"use strict";
this.width = 0;
this.height = 0;
this.setHeight = function (height) {
this.height = height;
};
this.getHeight = function () {
return this.height;
};
}
ProgressBar.prototype.setWidth = function (width) {
"use strict";
this.width = width;
};
ProgressBar.prototype.getWidth = function () {
"use strict";
return this.width;
};
function ComposedProgressBar() {
"use strict";
this.progressBar = new ProgressBar();
ProgressBar.call(this);
}
var composedProgressBar = new ComposedProgressBar();
composedProgressBar.setHeight(300);
console.log(composedProgressBar.getHeight());
composedProgressBar.setWidth(300);
console.log(composedProgressBar.getWidth());
答案 0 :(得分:1)
我想你可以这样写:
for (var methodName in ProgressBar.prototype) {
if (typeof ProgressBar.prototype[methodName] === 'function'
&& ProgressBar.prototype[methodName]
!== ComposedProgressBar.prototype[methodName]) {
ComposedProgressBar.prototype[methodName] = (function (methodName) {
return function () {
return this.progressBar[methodName]
.apply(this.progressBar, arguments);
};
})(methodName);
}
}
(当然,这只会为ProgressBar.prototype
中已存在的方法创建委托:它不会检测到以后添加的任何方法,也不会支持apply
的临时方法。)