javascript - 在 Javascript 中使用组件

标签 javascript python components

我对 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/

相关文章:

javascript - 在 Ember.js 中使用 sendAction() 实现数据向下操作向上模式

javascript - 未捕获的 TypeError : $(. ..).leanModal 不是 HTMLDocument 中的函数。<匿名>

python - 使用 Python 将表从 KDB+ 更新到 SQL Server

python - 修改工作簿 openpyxl 时如何保留形状?

java - FlowLayout对象中的组件setSize方法

reactjs - 如何使用钩子(Hook)显示和隐藏 react 组件

javascript - 追加后滚动 LI 不隐藏

javascript - 检查对象或数组中是否存在值

python - 如何在pyqt(QGIS)中捕捉QDockWidget的KeyPressedEvent

components - 我可以将自定义 View 组件注入(inject) Vue.js 网格组件吗?