ES6从继承的类调用父函数

时间:2018-04-15 23:33:38

标签: javascript ecmascript-6 es6-class

我正试图找到一种简单的方法来从子节点调用父函数。但是,无法像在其他编程语言中那样直接从子实例中调用它。

class ExchangeHandler {
    constructor(getMarketsUrl, getMarketDataBaseUrl, interval) {
        this.interval = interval;
        this.getMarketsUrl = getMarketDataBaseUrl;
        this.getMarketDataBaseUrl = getMarketDataBaseUrl;
    }

    getMarketsUrl() {
        return this.getMarketsUrl;
    }

    getMarketDataBaseUrl() {
        return this.getMarketDataBaseUrl;
    }

    buildQueryUrl(params) {
        return querystring.stringify(params);
    }

    getIntervalParam() {
        return config.intervalToExchangeInput[[config.exchange]][[this.interval]];
    }
}

class BittrexHandler extends ExchangeHandler {
    constructor(interval) {
        super("https://bittrex.com/api/v1.1/public/getmarkets", 
                "https://bittrex.com/Api/v2.0/pub/market/GetTicks", 
                interval);
    }

    buildGetMarketTickerUrl(symbol) {
        return super.getMarketDataBaseUrl() + "?"
                + super.buildQueryUrl({marketName: this.buildSymbolParam(symbol),
                                    tickInterval: super.getIntervalParam()})
    }

    buildSymbolParam(symbol) {
        return "BTC-" + symbol;
    }
}

var bittrexHandler = ExchangeHandlerFactory.getExchangeHandler("bittrex", "hour");
console.log("getMarketsUrl: " + bittrexHandler.getMarketsUrl());

我得到了

TypeError: bittrexHandler.getMarketsUrl is not a function

这不是javascript中的可能吗?非常感谢!

1 个答案:

答案 0 :(得分:3)

您不能拥有与getMarketsUrl相同名称的数据属性和方法。它们占据对象上的相同属性槽。更改其中一个的名称。

当您尝试执行该方法时,解释器首先找到数据属性,因此您无法以正常方式调用该方法。

此外,您不应该使用super在对象上调用非重写方法。例如,更改此:

buildGetMarketTickerUrl(symbol) {
    return super.getMarketDataBaseUrl() + "?"
            + super.buildQueryUrl({marketName: this.buildSymbolParam(symbol),
                                tickInterval: super.getIntervalParam()})
}

到此:

buildGetMarketTickerUrl(symbol) {
    return this.getMarketDataBaseUrl() + "?"
            + this.buildQueryUrl({marketName: this.buildSymbolParam(symbol),
                                tickInterval: this.getIntervalParam()})
}