在Javascript中调用组合私有类成员的公共实例方法而不使用passthrough函数

时间:2013-07-17 19:47:18

标签: javascript oop

我试图找到一种方法来避免在类的原型上创建大量的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());

1 个答案:

答案 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的临时方法。)