Який рекомендований підхід для допоміжних функцій? Я хотів би вибрати одну техніку і побігти з нею, щоб створити свій новий "клас".
Ось варіанти дизайну, про які я розмірковував:
Варіант 1: Функція помічника у зовнішній області, виклик із контекстом екземпляра
function createPane (pane) {
// logic to create pane
var proto = Object.create(this.paneList);
$.extend(paneProto, pane);
return paneProto;
}
Panes.prototype.initialize = function (panes) {
var _this = this;
_.each(panes, function () {
_this.panes.push(createPane.call(_this, this));
});
}
- Плюси: простий синтаксис.
createPaneне публікується в екземплярі. - Мінуси:
createPaneдоступний в інших сферах.
Варіант 2: Функція помічника у закритті, виклик із контекстом екземпляра
Panes.prototype.initialize = (function () {
function createPane (pane) {
// same logic as last createPane
}
return function (panes) {
// same logic as before - calls createPane
}
})();
- Плюси:
createPaneне публікується в екземплярі. - Мінуси: менша читабельність та перевіряемость; Тестування цього помічника має відбуватися в межах ініціалізації.
Варіант 3: Додайте _ до імені, щоб вказати приватний метод
Panes.prototype._createPane = function (pane) {
// same logic as last createPane
}
Panes.prototype.initialize = function (panes) {
// same logic as last, except calls this._createPane
}
- Плюси: неявним контекстом
_createPaneє екземпляр. Заповітність ззовні. - Мінуси: Розкриття функції помічника на екземплярі.
Варіант 4: Хелпер функціонує як аргумент
Panes.prototype.initialize = (function (createPane) {
return function (panes) {
// same logic as before - calls createPane
}
})(function createPane () {
// same logic as last createPane
});
- Плюси:
createPaneне публікується в екземплярі. Функції помічників не мають доступу один до одного. - Мінуси: менша читабельність та перевіряемость; Тестування цього помічника має відбуватися в межах ініціалізації.