0

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

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

当我创建一个对象时,我可能有这个:

function MyObject()
{
    var base = {};

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

   return base;
}

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

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

4 回答 4

2

首先,我建议您阅读这篇出色的 MDN 文章。它会启发你。

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

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
于 2012-05-08T04:48:49.087 回答
0

+1 为 zzzzBov 的评论。你在base应该使用的时候使用prototype。不是在构造函数内部,而是在构造函数之后进一步细化类定义。

于 2012-05-08T04:44:31.693 回答
0
function MyObject() {
    this.value = 5;
}
MyObject.prototype.update = function() {
     this.value++;
}
Var newObject = new MyObject();
newObject.update =function() {
    value--;
}
于 2012-05-08T04:52:17.813 回答
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(); 
于 2012-05-08T04:54:51.787 回答