Qual è l'approccio consigliato per le funzioni di supporto? Vorrei scegliere una tecnica e usarla per creare la mia nuova "classe".
Ecco le opzioni di progettazione che ho preso in considerazione:
Opzione 1: funzione di supporto in ambito esterno, invoca con contesto di istanza
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));
});
}
-
Pro: sintassi semplice.
createPane
non è pubblicato sull'istanza. -
Contro:
createPane
è accessibile in altri ambiti.
Opzione 2: funzione di supporto in chiusura, invoca con contesto di istanza
Panes.prototype.initialize = (function () {
function createPane (pane) {
// same logic as last createPane
}
return function (panes) {
// same logic as before - calls createPane
}
})();
-
Vantaggi:
createPane
non è pubblicato sull'istanza. - Contro: minore leggibilità e testabilità; Il test di questo helper deve avvenire nell'ambito di inizializzazione.
Opzione 3: Prependa _ al nome per indicare un metodo privato
Panes.prototype._createPane = function (pane) {
// same logic as last createPane
}
Panes.prototype.initialize = function (panes) {
// same logic as last, except calls this._createPane
}
-
Vantaggi: Il contesto implicito di
_createPane
è l'istanza. Testabilità dall'esterno. - Contro: Esposizione della funzione di supporto sull'istanza.
Opzione 4: Helper funziona come argomento
Panes.prototype.initialize = (function (createPane) {
return function (panes) {
// same logic as before - calls createPane
}
})(function createPane () {
// same logic as last createPane
});
-
Vantaggi:
createPane
non è pubblicato sull'istanza. Le funzioni di supporto non hanno accesso l'un l'altro. - Contro: minore leggibilità e testabilità; Il test di questo helper deve avvenire nell'ambito di inizializzazione.