如何在基本构造函数中调用重写的方法
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()
。
这是我的代码。
它在创建继承映射 (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()
。