我对 Javascript 比较陌生。我想知道它是否像 Python 那样支持组件和对象。如果是,语法会是什么样子?
例如,我知道一个对象看起来像这样:
function Foo(a, b) {
this.a = a;
this.b = b;
}
现在,有没有办法声明一些组件,选择其中一个,然后将其添加到对象中?例如,假设我有一个对象 Item。我可以声明一些不同的组件,例如武器、魔法、传奇等,然后将它们添加到对象中吗?使用这种方法,我最终可能会得到一件魔法武器、一件传奇元素,甚至一件传奇魔法武器。
我考虑过为此使用育儿,但对于我想做的事情,这似乎相当有限。例如,我的继承体系看起来像元素/武器或元素/传奇,所以我不能拥有传奇武器。
那么,Javascript 中的组件是否可行?
最佳答案
您所说的“组件”通常称为类。您所说的“育儿”通常被称为继承。您对类层次结构很了解:)
好的,所以您的基类在 Item
中。该元素将具有游戏世界中所有元素必须具有的基本属性。您游戏世界中的所有对象都将继承自 Item。
Weapon
是一个元素。 MagicalItem
是一个项目。 LegendaryItem
是一个项目。这三个类都是Item的子类。
当您想要一个 LegendaryMagicalWeaponItem
时,事情会变得有点棘手。这就是您问题的本质:JavaScript 中是否可以进行多重继承?
套用 Boondock Saints 的话,除非您绝对肯定地确定自己需要多重继承,否则您不想要多重继承。为什么?它很快会导致并发症。例如,如果两个父类(super class)具有同名的方法或属性怎么办?如果它们继承自两个不同的基类,并且这些 类中的一个导致名称冲突怎么办?你可以看到这是怎么回事。
幸运的是,JavaScript 和 Python 一样,是一种非常灵活的语言。您不必被迫使用多重继承甚至接口(interface)来泛化异构对象的行为。
假设 MagicalItem
有一个 mana
属性,而 LegendaryItem
有一个 legacy()
方法。假设一个武器对象有一个damage
。假设 Item
具有重要的物理属性和一堆物理方法;它显然是“主导”父类(super class)。没有什么能阻止你这样做:
// Base classes
function Item() {
// some default values...
}
Item.prototype.physics = function (t) {/* physics stuff */}
function Magical(mana) {
this.mana = mana;
}
function Weapon(damage) {
this.damage = damage;
}
function Legendary(legacy) {
this.legacy = function () {return legacy;};
}
// Actual world item class
function MyLegendaryMagicalSword(x,y) {
this.x = x;
this.y = y;
Weapon.call(this, MyLegendaryMagicalSword.DAMAGE);
Legendary.call(this, MyLegendaryMagicalSword.LORE);
Magical.call(this, MyLegendaryMagicalSword.START_MANA);
}
// actual prototypal inheritance
MyLegendaryMagicalSword.prototype = new Item();
// class attributes
MyLegendaryMagicalSword.DAMAGE = 1000;
MyLegendaryMagicalSword.START_MANA = 10;
MyLegendaryMagicalSword.LORE = "An old sword.";
// Sword instance
var sword = new MyLegendaryMagicalSword(0, 0);
sword.physics(0);
sword.mana;
sword.legacy();
// etc
// probe object for supported interface
if (sword.hasOwnProperty("damage")) {
// it's a weapon...
}
按照您的描述,这是一种卑鄙而肮脏的方式。
> sword
{ x: 0,
y: 0,
damage: 1000,
legacy: [Function],
mana: 10 }
关于javascript - 在 Javascript 中使用组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5627874/