在JavaScript中扩展/覆盖?

时间:2012-05-08 04:35:28

标签: javascript

我想用JavaScript和<canvas>编写一个小游戏,但首先我要指出使用对象的“正确”或至少是常用的方法。

我特别难以理解的一个主题是如何实现overriding方法。

当我创建一个Object时,我可能会这样:

function MyObject()
{
    var base = {};

    base.i = 0;
    base.update = function()
    {
        base.i ++;
    }

   return base;
}

然后,当我创建另一个应该以相同成员开头的Object时,我使用它:

function AnotherObject()
{
    var base = new MyObject();

    base.j = 0;

    return base;
}

我想在AnotherObject.update()中运行逻辑时向MyObject.update()添加更多内容,但是当我在AnotherObject()内执行此操作时:

base.update = function()
{
    j ++;
}

然后我当然失去了我在MyObject.update()中添加的逻辑。

如何撰写AnotherObject.update()以便它还调用update()定义的原始MyObject方法?

4 个答案:

答案 0 :(得分:2)

首先,我建议你阅读这篇优秀的excellent MDN article。它会启发你。

您可以通过这种方式实现子类化:

function MyObject() {
  this.i = 0;
}

MyObject.prototype.update = function() {
  this.i++;
}

function AnotherObject() {
  MyObject.call(this);
  this.j = 0;
}

AnotherObject.prototype = new MyObject;

AnotherObject.prototype.constructor = AnotherObject;

AnotherObject.prototype.update = function() {
  MyObject.prototype.update.call(this);
  this.j++;
}

obj = new AnotherObject();
console.log(obj.i); //0
console.log(obj.j); //0

obj.update();
console.log(obj.i); //1
console.log(obj.j); //1

console.log(obj instanceof MyObject) //true
console.log(obj instanceof AnotherObject) //true

答案 1 :(得分:0)

对于zzzzBov的评论,

+1。当您使用base时,您正在使用prototype。不在构造函数内,而是在构造函数之后进一步细化类定义。

答案 2 :(得分:0)

function MyObject() {
    this.value = 5;
}
MyObject.prototype.update = function() {
     this.value++;
}
Var newObject = new MyObject();
newObject.update =function() {
    value--;
}

答案 3 :(得分:0)

正如其他人所建议的那样,你应该遵循基于原型的继承。这是正确的做法。

但是,作为迄今为止所做工作的解决方案,您可以执行以下操作

function MyObject() {
    var base = {};
    base.i = 0;
    base.update = function () {
        this.i++;
    }
    base.show = function () {
        console.log("i is " + this.i);
    }
    return base;
}

function AnotherObject() {
    var base = new MyObject();
    base.j = 0;
    var update = base.update;  // proxy variable that refers to original `update`
    base.update = function () {
        update.call(this);  // invoke original `update`
        this.j++;
    }
    var show = base.show;  // proxy variable that refers to original `show`
    base.show = function () {
        show.call(this);   // invoke original `show`
        console.log("j is " + this.j);
    }
    return base;
}

var t = AnotherObject();
t.update();
t.show();