Contesto
Sto scrivendo una libreria di JavaScript e sto scoprendo che non so quale sia il modo migliore per supportare la creazione di oggetti . Ho trovato una lista di cose che sto considerando:
var obj = Library.newObj('object-type');
var obj = Library.newObj(Library.ObjectType); // Library.ObjectType is an object containing information about how to create the new object
var obj = Library.newObj(Library.ObjectType); // Library.ObjectType is an integer specifying the type
var obj = new Library('object-type');
var obj = new Library(Library.ObjectType); // Library.ObjectType is an object containing information about how to create the new object
var obj = new Library(Library.ObjectType); // Library.ObjectType is an integer specifying the type
var obj = new Library.ObjectType();
In particolare, questi oggetti dovrebbero anche avere opzioni specificabili. Sembrerebbe quindi
var obj = Library.newObj('object-type', { /* options */ });
var obj = Library.newObj(Library.ObjectType({ /* options */ }));
var obj = Library.newObj(Library.ObjectType, { /* options */ });
var obj = new Library('object-type', { /* options */ });
var obj = new Library(Library.ObjectType({ /* options */ }));
var obj = new Library(Library.ObjectType, { /* options */ });
var obj = new Library.ObjectType({ /* options */ });
// Or, when the user wants to change options separately:
obj.setOptions({ /* options */ });
obj.setOption1(val1).setOption2(val2);
Penso che potrei non voler specificare il tipo di oggetto semplicemente con una stringa o un intero perché potrebbe essere difficile da mantenere e non è molto estensibile .
Domanda
Quali sono i pro e contro di queste varianti? Esiste una best-practice / convention di cui non sono a conoscenza? Dovrei supportare più modi per creare oggetti? (O ci sono altre varianti che non ho considerato?)
Il mio caso specifico
(I particolari della mia situazione sono che voglio consentire agli sviluppatori che usano la libreria di fornire i propri 'modelli di creazione dell'oggetto' che funzionano con la libreria, ma la libreria fornirà anche alcuni 'modelli' predefiniti (come Library.ObjectType
). Inoltre, non voglio esporre più di una cosa (come Library
sopra) allo spazio dei nomi globale quando viene usata nel browser, ma vorrei comunque evitare il dot-horror, ad esempio:
Library.objects.objectCreator.createObject(Library.objects.objectTypes.ObjectType1);