如何在基本构造函数中调用重写的方法

How to call overriden methods in base constructor

这是我的代码。 它在创建继承映射 (CustomMap) 的新实例时抛出。 调用 namespace.Map.apply(this, mapContainer);

时,似乎 init 函数在基本构造函数调用中不可用

https://jsfiddle.net/y6qg4xbn/

var namespace = window.namespace || {};

namespace.Map = function (mapContainer) {

    this.mapContainer = mapContainer;

    this.preinit();
    this.init();
}

namespace.Map.prototype.preinit = function () {
};

namespace.Map.prototype.init = function () {
};

namespace.CustomMap = function (mapContainer) {
    namespace.Map.apply(this, mapContainer);
};
namespace.CustomMap.prototype = Object.create(namespace.Map);
namespace.CustomMap.prototype.preinit = function () {
    // do some stuff or even call base preinit
}

var newMap = new namespace.Map();
var inheritedMap = new namespace.CustomMap();

改变这个:

namespace.CustomMap.prototype = Object.create(namespace.Map);

对此:

namespace.CustomMap.prototype = Object.create(namespace.Map.prototype);

您应该将 CustomMap.prototype 基于 Map.prototype,而不是 Map。基础中没有 .init() 方法,因为您在创建派生原型时没有包含基础原型。


还有一个单独的问题,您需要更改它:

namespace.Map.apply(this, mapContainer);

对此:

namespace.Map.call(this, mapContainer);

因为 mapContainer 是一个特定的变量,而不是参数数组,这意味着您应该使用 .call() 而不是 .apply()