Недавно я изучал 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.
Итак, мои вопросы: :
Subclass.prototype = new Superclass()
вместо выполнения метода Subclass.prototype = { __proto__:Superclass.prototype, define_prototype_methods_here}
, но я думаю, что должен быть какой-то метод, если gnome-shell использует его последовательно?Superclass.prototype._init.call(this)
с в Subclass._init
, чтобы убедиться, что Subclass.prototype
получает все методы/свойства . ] Суперкласс
(который я затем добавляю к моему определению Subclass.prototype
), если Суперкласс
не имеет функции _init
( то естьесть ли у него эквивалентная функция-конструктор, которую я вызываю)?Я действительно запутался во всем этом, поэтому, пожалуйста, простите меня, если мой вопрос не имеет особого смысла; это будет из-за степени моего непонимания и замешательства!
РЕДАКТИРОВАТЬ : уточнение:
- Я знаю, что __proto__
не рекомендуется, потому что он нестандартен, но мой код никогда не будет работать в браузере - он будет работать только с javascript GNOME (который в основном является движком javascript Mozilla). ), поэтому мне не нужно беспокоиться о кросс-совместимости.