如何在基础构造函数中调用overriden方法

时间:2015-12-16 16:50:34

标签: javascript prototypal-inheritance

这是我的代码。 它在创建继承映射的新实例(CustomMap)时抛出。 调用init

时,基本构造函数调用中似乎没有namespace.Map.apply(this, mapContainer);函数

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();

1 个答案:

答案 0 :(得分:1)

改变这个:

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()