Вопрос:
Казалось бы, простой вопрос, который я исследовал в течение последних 2 недель (пожалуйста, полегче, поскольку я новичок во всем этом!):
Как аккуратно реализовать наследование в JavaScript при использовании Require.js и шаблона раскрывающегося модуля?
Пример:
Вот пример модуля, который является базовым классом некоторого типа «Component
»:
define('Component', [], function () {
"use strict";
var _privateVar = 10;
var _doPrivateThings = function () { /* do stuff */ };
var init = function () { /* do stuff */ };
var update = function () { /* do stuff */ };
return {
init : init,
update : update
};
});
Далее я хочу реализовать CakeComponent
, который должен наследовать все от Component
и позволить мне редактировать/добавлять методы и свойства:
define('CakeComponent', ['Component'], function (Component) {
"use strict";
// Setup inheritance
var CakeComponent = function() {}
CakeComponent.prototype = new Component();
// Add/edit methods/properties
CakeComponent.prototype.newMethod = function () { /* do stuff */ };
return {
init : CakeComponent.init,
update : CakeComponent.update,
newMethod : CakeComponent.newMethod
};
});
Во-первых, я не уверен, что это имеет смысл, но, во-вторых, мой CakeComponent кажется немного грубым, потому что теперь у меня повсюду эта избыточность CakeComponent
, и мне пришлось «повторно раскрывать» методы init
и update
.
Я бы предпочел что-то вроде этого (я понимаю, что это не имеет смысла, это просто псевдокод):
define('CakeComponent', ['Component'], function (Component) {
"use strict";
this.extends(Component);
var newMethod = function () { /* do stuff */ };
return {
newMethod : newMethod
};
});
Любые советы или предложения будут действительно оценены. Спасибо.
Более подробная информация
- Может быть, мне всегда следует создавать объект класса в оболочке
define
? Я видел, как люди делают это, но это казалось ненужным, пока я не столкнулся с этой проблемой. - Будет ли вообще полезен в этом контексте метод
.call()
объекта функции? например используяComponent.call()
- @Bergi, пожалуйста, смотрите ниже:
define([], function () {
"use strict";
var Component = function () {
var _privateVar = 10;
var _doPrivateThings = function () { /* do stuff */ };
this.init = function () { /* do stuff */ };
this.update = function () { /* do stuff */ };
};
return Component;
});
new Component();
, кажется, вообще не работает, вашComponent
- это объект модуля, а не конструктор класса? - person Bergi   schedule 24.04.2015return
конструктор из вашихdefiner
функций, а не литерал объекта, как вы делаете сейчас. Если вы хотите иметь модули, что вы подразумеваете под наследованием? - person Bergi   schedule 25.04.2015prototype
и отказываться от частных свойств и методов, если я хочу наследования? - person   schedule 25.04.2015Component
, это лучше. Хотя вам не нужно использовать.prototype
, вам лучше это сделать. Вы бы не возвращали литералы из конструктора, а просто использовали быthis
. Нет, вы по-прежнему можете использовать закрытые переменные и методы в своем конструкторе. - person Bergi   schedule 25.04.2015this
? (см. обновленный код в разделе Дополнительные сведения) - person   schedule 25.04.2015