覆盖javascript对象属性的函数

时间:2017-04-19 22:26:54

标签: javascript oop inheritance

当函数在父对象中的另一个对象上时,如何覆盖javascript对象上的函数。

示例:

function TestingABC() {
     this.events = { finish: function() { console.log("FINISHED"); } };
}

function TestingXYZ() {
     TestingABC.call(this);
}

TestingXYZ.prototype = Object.create(TestingABC.prototype);

我如何覆盖TestingXYZ上的events.finish函数来运行父(TestingABC)代码以及我需要编写的一些新代码?

2 个答案:

答案 0 :(得分:0)

因为events对象是实例的属性,而不是原型的属性,所以你可以使用类似于 monkey patching 的技术,在那里存储对当前函数的引用,然后除了执行其他操作外,还可以使用可以调用旧函数的函数覆盖当前函数。

e.g。

function TestingABC() {
     this.events = { finish: function() { console.log("FINISHED"); } };
}

function TestingXYZ() {
     TestingABC.call(this);
     var superEvents = this.events;
     this.events = {
         finish: function () {
              superEvents.finish();
              doMyStuff();
         }
     };
}

TestingXYZ.prototype = Object.create(TestingABC.prototype);

答案 1 :(得分:0)

.eventsTestingABC()构造函数的实例化属性 - 因此您可以在实例化后修改该值。

也许这样的事情就是你所追求的......

function TestingABC() {
     this.events = {
        finish: function() {
            console.log('ABC FINISHED');
        },
        other: function() {
            console.log('ABC OTHER');
        }
    };
}

function TestingXYZ() {
     TestingABC.call(this);
}

TestingXYZ.prototype = Object.create(TestingABC.prototype);

TestingXYZ.prototype.callEvents = function() {
    this.events.finish();
    this.events.other();
}

var test1 = new TestingABC();
var test2 = new TestingXYZ();

test2.events.finish = function() {
    console.log('XYZ FINISHED');
};

test1.events.finish();
test1.events.other();
//-> ABC FINISHED
//-> ABC OTHER

test2.callEvents();
//-> XYZ FINISHED
//-> ABC OTHER