【发布时间】:2013-02-09 01:27:58
【问题描述】:
我是 Javascript 编程的新手,我正在从面向对象编程的角度来处理我的第一个应用程序(实际上是一个游戏)(我知道 js 并不是真正面向对象的,但对于这个特殊问题,这对我来说更容易像这样开始)。
我有一个“类”层次结构,其中最顶层(“事物”类)定义了相关事物的列表(游戏中的附加项目)。它由 ThingA1 和 ThingA2 类继承的 ThingA 类继承。
最简单的例子是:
function Thing()
{
this.relatedThings = [];
}
Thing.prototype.relateThing = function(what)
{
this.relatedThings.push(what);
}
ThingA.prototype = new Thing();
ThingA.prototype.constructor = ThingA;
function ThingA()
{
}
ThingA1.prototype = new ThingA();
ThingA1.prototype.constructor = ThingA1;
function ThingA1()
{
}
ThingA2.prototype = new ThingA();
ThingA2.prototype.constructor = ThingA2;
function ThingA2()
{
}
var thingList = [];
thingList.push(new ThingA());
thingList.push(new ThingA1());
thingList.push(new ThingA2());
thingList.push(new ThingA2());
thingList.push(new Thing());
thingList[1].relateThing('hello');
在代码的最后,当执行关联事物时,每个 ThingA、ThingA1 和 ThingA2 都将执行它(不是数组中的最后一个“Thing”对象)。我发现如果我在 ThingA 原型中定义了相关函数,它将正常工作。由于游戏的设计方式,我宁愿不必这样做。
也许我不了解原型如何在 javascript 中工作。我知道该功能在所有对象之间共享,但我想执行将是单独的。有人可以解释为什么会发生这种情况以及如何解决它吗?我不知道是我做错了继承,或者原型定义,还是什么。
提前致谢。
【问题讨论】:
-
JavaScript 几乎都是基于对象的,为什么不应该是面向对象的呢?
-
据我所知,原型语言与面向对象的语言并不完全相同(没有类等),尽管概念可能相似。但我不是专家。
-
JavaScript 强烈面向对象这一事实并不意味着它的工作方式与其他 OO 语言相同。事实上,继承是不支持的。许多库实现了高级方法,这些方法确实是改进继承工作方式的解决方法。目前我发现的最好的之一是 John Resig 的,它基于 Prototype 和 base2 库,但进一步改进。 ejohn.org/blog/simple-javascript-inheritance
-
您的代码没有按预期工作吗?不明白你想要什么结果和你得到了什么
-
@Joel_Blum 执行后,所有对象在它们各自的relatedThings 数组中都有一个“hello”。我原以为只有 thingList[1] 会拥有它。
标签: javascript inheritance prototype