0

我试图找到一种方法来避免在类的原型上创建大量传递方法。我有一个 ProgressBar 类,它有很多实例方法。我想创建一个新类(在我的代码示例中称为 ComposedProgressBar),它“有一个”progressBar 实例,并且不从 ProgressBar 继承。

为了从客户端代码访问progressBar 的实例方法,通常会创建一系列传递函数。如:

ComposedProgressBar.prototype.setWidth = function (width) {
    this.progressBar.setWidth(width);
};

但是,我试图避免这种情况。

我可以通过将以下内容添加到 ComposedProgressBar 的构造函数来访问 progressBar 的特权方法:

ProgressBar.call(this);

但是,这不适合我想要实现的。我需要访问已添加到 ProgressBar 原型中的方法。

下面是基于我目前正在使用的示例代码。我已经包含了高度设置器和获取器,只是为了说明使用 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());
4

1 回答 1

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。)

于 2013-07-17T19:59:38.737 回答