我想用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
方法?
答案 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)
+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();