Создание подкласса с .prototype и __proto__

Недавно я изучал javascript, написав некоторые расширения оболочки gnome, и, следовательно, мое понимание Javascript было сформировано примерами, которые я наблюдал в исходники javascript gnome-shell. У меня такое чувство, что я неправильно понимаю классы и просто хочу получить некоторые разъяснения.

Я написал несколько собственных подклассов, и в каждом случае я определял их, просто следуя аналогичному коду в исходном коде javascript gnome-shell:

Subclass = function() {
    this._init.apply(this,arguments);
}
Subclass.prototype = {
    __proto__: Superclass.prototype,
    _init: function() {
        Superclass.prototype._init.call(this);
    },
    // add other methods of Subclass here.
}

До сих пор я думал, что это стандартный способ создание класса Подкласса, который был в основном Суперклассомплюс дополнения. Я предполагал, что у каждого объекта есть метод _init.

Недавно я пытался применить тот же метод для создания подкласса Clutter.Actor(важно то, что это не класс, определяемый оболочкой GNOME), и понял, что описанный выше способ подклассов объектов не является стандартом.Во-первых, не каждый класс имеет функцию _init, как я предполагал; это просто то, что GNOME-shell сделал в своих классах javascript.

Итак, мои вопросы: :

  1. Есть ли какая-либо документация относительно описанного выше метода создания подклассов? Во всех руководствах, которые я видел, говорится, что нужно установить Subclass.prototype = new Superclass()вместо выполнения метода Subclass.prototype = { __proto__:Superclass.prototype, define_prototype_methods_here}, но я думаю, что должен быть какой-то метод, если gnome-shell использует его последовательно?
  2. Если бы я хотел максимально приблизиться к указанному выше способу определения классов (чтобы сохранить некоторое сходство кода с оболочкой GNOME, для которой я пишу расширения), что мне заменить Superclass.prototype._init.call(this)с в Subclass._init, чтобы убедиться, что Subclass.prototypeполучает все методы/свойства . ] Суперкласс(который я затем добавляю к моему определению Subclass.prototype), если Суперклассне имеет функции _init( то естьесть ли у него эквивалентная функция-конструктор, которую я вызываю)?

Я действительно запутался во всем этом, поэтому, пожалуйста, простите меня, если мой вопрос не имеет особого смысла; это будет из-за степени моего непонимания и замешательства!

РЕДАКТИРОВАТЬ : уточнение: - Я знаю, что __proto__не рекомендуется, потому что он нестандартен, но мой код никогда не будет работать в браузере - он будет работать только с javascript GNOME (который в основном является движком javascript Mozilla). ), поэтому мне не нужно беспокоиться о кросс-совместимости.

7
задан Felix Kling 14 May 2012 в 10:02
поделиться