Использование компонентов в Javascript - PullRequest
1 голос
/ 12 апреля 2011

Я относительно новичок в Javascript.Мне было интересно, если он поддерживает компоненты и объекты, как Python.Если да, то как будет выглядеть синтаксис?

Например, я знаю, что объект выглядит следующим образом:

function Foo(a, b) {
    this.a = a;
    this.b = b;
}

Теперь, есть ли способ объявить некоторые компоненты, выберите одиниз тех, и добавить его к объекту?Например, допустим, у меня есть объект Item.Могу ли я объявить некоторые разные компоненты, такие как Оружие, Магический, Легендарный и т. Д., И добавить их к объекту?Используя этот подход, я мог бы получить Магическое Оружие, или Легендарный Предмет, или даже Легендарное Магическое Оружие.

Я думал об использовании родительских обязанностей для этого, но для того, что я хочу сделать, кажется, что этобыть довольно ограниченным.Например, моя иерархия выглядела бы как Предмет / Оружие или Предмет / Легендарный, поэтому у меня не было Легендарного Оружия.

Итак, возможны ли компоненты в Javascript?

Ответы [ 4 ]

1 голос
/ 12 апреля 2011

То, что вы описываете как «компонент», чаще называют классом. То, что вы описываете как «воспитание», чаще всего называется наследованием. Вы в курсе об иерархии классов:)

Итак, ваш базовый класс в Item. Этот предмет будет иметь основные атрибуты, которыми должны обладать все предметы в вашем игровом мире. Все объекты в вашем игровом мире будут наследоваться от Предмета.

A Weapon - это предмет. A MagicalItem это пункт. A LegendaryItem это предмет. Эти три класса являются подклассами Item.

Все становится немного сложнее, когда вы хотите LegendaryMagicalWeaponItem. В этом суть вашего вопроса: возможно ли множественное наследование в JavaScript?

Если перефразировать Святых из Бундока, вам не нужно множественное наследование, если вы абсолютно не уверены, что оно вам нужно. Зачем? Это быстро приводит к осложнениям. Например, что если два суперкласса имеют метод или атрибут с одинаковым именем? Что если они наследуются от двух разных базовых классов, и один из этих классов вызывает конфликт имен? Вы можете видеть, куда это идет.

К счастью, JavaScript, как и Python, является очень гибким языком. Вы не обязаны использовать множественное наследование или даже интерфейсы для обобщения поведения разнородных объектов.

Допустим, MagicalItem имеет свойство mana, а LegendaryItem имеет метод legacy(). Допустим, объект оружия имеет damage. Допустим, Item имеет важные физические атрибуты и набор физических методов; это явно «доминирующий» суперкласс. Ничто не мешает вам сделать это:

// 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 }
1 голос
/ 12 апреля 2011

Понятия не имею, что вы подразумеваете под компонентами. Термин слишком обобщенный. В Delphi компонент представляет собой модуль невидимого кода, который вводит некоторые специальные функции в приложение. «Таймер» является одним из таких примеров компонента (в Delphi).

Судя по вашему описанию, вы хотите добавить свойства динамически? Или речь идет о перегрузке?

В последнем случае вы не можете сделать это намеренно, так как это снимает ограничения, которые вы упомянули.

Пример (смешивание):

function mixItems(weapon,legend){
    return {
        "damage":legend.damage+weapon.damage,
        "name":legend.name+"' "+weapon.name
    };
}

var weapon={ "damage":45, "name":"sword"};

var legend={ "name":"Goliath", "damage":34 };

var LegendaryWeapon = mixItems(weapon,legend);

console.log( LegendaryWeapon );
// output:- name: "Goliath's sword", damage: 79

Пример (расширение):

function clone(old){ // non-deep cloning function
    var res={};
    for(i in old)
        res[i]=old[i];
    return res;
}

var sword = {
    "damage":50
    "hit": function(){ // returns the percentage hit chance
        return Math.round(Math.random()*100);
    }
};

var bigsword=clone(sword);

bigsword.damage=60;
bigsword.hit=function(){ // returns the percentage hit chance
    return Math.round(Math.random()*80)+20;
};
0 голосов
/ 12 апреля 2011

Пример вашего кода - это объект Function, который предназначен для использования в качестве функции-конструктора, т.е. вызывайте его с ключевым словом new, и он возвращает экземпляр объекта, который имеет свойство a и * 1004.* свойство (среди других унаследованных свойств).

Function объекты наследуются от Object, как и все другие объекты в JavaScript.

Обычно объекты создаются с использованием литерального синтаксиса объекта, т.е. var x = {a: 'a', b: 'b'};хотя их также можно создать с помощью ключевого слова new с Object.

Похоже, ваш вопрос касается наследования с помощью JavaScript.Ну, есть много способов выполнить наследование.Одним из примеров является

function A() { }

function B() { }
B.prototype = new A;

Здесь и A, и B являются функциями конструктора.Функции имеют свойство prototype, которое является объектом и может содержать члены, которые могут использоваться всеми экземплярами объекта, созданными функцией.Мы присваиваем экземпляр объекта, возвращаемый функцией конструктора A, прототипу B, предоставляя B всем членам, доступным для экземпляра A.Это только один из способов наследования в JavaScript.

Статья Центра разработчиков Mozilla по объектной модели стоит прочитать.

0 голосов
/ 12 апреля 2011

объект в javascript выглядит так:

var Foo = {
    a: null,
    b: null,

    init: function(a,b){
        this.a = a;
        this.b = b;
    }

}
//call the init:
Foo.init(12,34);

почти так же, как у вас в вопросе.

И этот объект расширяемый

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...