2012-11-08 7 views
5

dire che voglio creare la seguente API:Fai la nuova parola chiave opzionale

var api = function(){} 

api.prototype = { 
    constructor: api, 
    method: function() { 
    return this; 
    } 
}; 

Ora, questo funzionerà come:

var myApi = new api(); 
myApi.method(); 

Ma diciamo che voglio fare la parola chiave new opzionale, in modo che questo funzionerà:

api().method(); 

sarei fuori di testa fare:

var api = function() { 
    if (!(this instanceof api)) { 
    return new api(); 
    } 
}; 

Ma mi stavo chiedendo, questo potrebbe essere facilmente infettato in qualche modo, o ci sono altri pericoli nell'usare questo metodo? So che f.ex jQuery non lo fa (scaricano il costruttore su un metodo prototipo), quindi sono sicuro che ci sono buone ragioni per non farlo. Io proprio non li conosco.

+1

La tua soluzione sembra perfettamente a posto, l'ho vista utilizzata in molti posti. Vedi [qui] (http://ejohn.org/blog/simple-class-instantiation/), per esempio. – bfavaretto

risposta

2

restituisce un oggetto nella funzione di costruzione.

function Car(){ 
    var obj = Object.create(Car.prototype); 
    obj.prop = 1; 
    return obj; 
} 
Car.prototype = { 
    method: function(){ } 
}; 

//test 
var car1 = Car(); 
var car2 = new Car(); 
+0

'Object.create (...)' è particolarmente buono poiché usa la coercizione sull'interrogazione ed elimina qualsiasi riferimento a 'this' nel costruttore, quindi non è necessario ragionare su cosa' this' è nel contesto del costruttore . I metodi avranno ancora accesso a "questo" come previsto. – Eric

-1

Selezionare una o l'altra convenzione. Se si desidera utilizzare oggetti per gli handle API, ma non si desidera che le persone debbano utilizzare new, utilizzare due funzioni. Api() che è un costruttore per gli oggetti e api() è una funzione regolare che restituisce appena una nuova istanza Api.

Non penso che ci sia un pericolo per ciò che proponi, sembra solo inutile e non mi piace l'idea di una funzione che fa due cose contemporaneamente.

+1

Rendere facoltativo 'new' consente ai team di utilizzare l'API in un modo che si adatta alle proprie convenzioni. Alcuni team sono fortemente contrari a "nuovi" per via dei suoi trucchi e altri lo usano per la stessa sensazione che hanno le lingue con l'ereditarietà. Sarebbe bello se l'API non costringesse i team a rompere le loro convenzioni come questa. La classe 'Router' di Express.js è un buon esempio di' new' opzionale. – Eric