覆盖基类函数

saz*_*azr 13 javascript inheritance overriding

在Javascript中,我迫切需要子类来覆盖基类特权函数.我不确定这是否可行,但如果有人能告诉我它是否以及如何做,那将会很棒.如果它不可能,还有另一种方法来实现我在下面的简单代码示例中尝试做的事情吗?

我无法将基类函数parseXML()转换为public,因为它需要访问私有变量

    function BaseClass()
    {
        var map = {};

        // I cannot make this function public BECAUSE it accesses & changes private variables
        this.parseXML = function( key, value )
        {
            alert("BaseClass::parseXML()");
            map[key] = value;
        }
    }

    function ChildClass()
    {
        BaseClass.call(this);
        this.parseXML = function( key, value, otherData )
        {
            alert("ChildClass()::parseXML()");

            // How can I call the base class function parseXML()?
            //this.parseXML();  // calls this function not the parent function
            //MyClass.prototype.doStuff.call
            BaseClass.prototype.parseXML.call(this, key, value);  // fails
            //BaseClass.prototype.parseXML(); // fails

            // perform specialised actions here with otherData
        }
    }

    ChildClass.prototype = new BaseClass;

    var a = new ChildClass();
    a.parseXML();
Run Code Online (Sandbox Code Playgroud)

Ray*_*nos 16

function BaseClass() {
    var map = {};
    this.parseXML = function(key, value) {
        alert("BaseClass::parseXML()");
        map[key] = value;
    }
}

function ChildClass() {
    BaseClass.call(this);
    var parseXML = this.parseXML;
    this.parseXML = function(key, value, otherData) {
        alert("ChildClass()::parseXML()");
        parseXML.call(this, key, value);
    }
}

ChildClass.prototype = new BaseClass;

var a = new ChildClass();
a.parseXML();
Run Code Online (Sandbox Code Playgroud)

实例

基本上,您缓存特权方法(仅在对象上定义),然后在分配给特权方法名称的新函数内调用它.

然而,更优雅的解决方案是:

function BaseClass() {
    this._map = {};
};

BaseClass.prototype.parseXML = function(key, value) {
    alert("BaseClass::parseXML()");
    this._map[key] = value;
}

function ChildClass() {
    BaseClass.call(this);
}

ChildClass.prototype = Object.create(BaseClass.prototype);
ChildClass.prototype.parseXML = function(key, value, otherData) {
    alert("ChildClass()::parseXML()");
    BaseClass.prototype.parseXML.call(this, key, value);
}

var a = new ChildClass();
a.parseXML();
Run Code Online (Sandbox Code Playgroud)

实例

使用奖金实施pd

  • 使用第二种方法有什么好处? (3认同)