【问题标题】:ES6 call parent function from inherited classES6从继承类调用父函数
【发布时间】:2018-04-15 23:33:38
【问题描述】:

我正在尝试找到一种从子函数调用父函数的简单方法。但是,实际上并没有像在其他编程语言中那样直接从子实例中调用它的方法。

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中是不可能的吗?非常感谢!

【问题讨论】:

  • 您使用的是super.methodName。你了解原型是什么吗?
  • @evolutionxbox 我正在学习 JS 你能详细说明你的问题吗?
  • 我会推荐你​​学习 JS 原型

标签: javascript ecmascript-6 es6-class


【解决方案1】:

您不能拥有与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()})
}

【讨论】:

  • 也许 OP 应该使用 getter 方法?
  • @evolutionxbox - 我认为数据属性getMarketsUrl 只需要一个不同的名称。即使他们使用 getter,该值的存储位置仍然需要不同的名称。
  • 确实如此。通常的做法是在属性名称前加上下划线来表示“私有”变量。
  • @evolutionxbox - 是的,这是一种方法。
  • @quartaela - Javascript 不直接支持私有成员变量作为关键字功能。添加下划线实际上并不使其私有。那只是一个约定。私有属性可以使用构造函数作为闭包来实现,如How to set javascript private variables in constructor 所示。但是,这需要在构造函数中定义任何想要访问此属性的方法(不使用 ES6 类语法)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多