2013-04-16 5 views
5

Puoi nominare un'istanza come il nome del costruttore?Puoi nominare un'istanza come il nome del costruttore?

var myFunc = new function myFunc(){}; 

?

Come sembra, questo sostituisce l'oggetto funzione con la nuova istanza ... il che significa che è un buon Singleton.

non ho visto nessuno di utilizzare questo, quindi credo che, ci sono aspetti negativi di questo che io sono a conoscenza di ...

Qualche idea?

+0

@PeeHaa 埽 Se non sei un ragazzo di JS, non importa se ti sembra tanto strano ... Se sembrava strano per uno sviluppatore JS , quindi mi interessa di più –

+0

In realtà lo fa. Perché sono qui per imparare ... – PeeHaa

+0

@PeeHaa 埽 Allora questa è una lezione? –

risposta

1

SI ...

Tuttavia, lo fa apparire strano che si sta creando una funzione denominata ma mai fare riferimento ad esso per nome.

Il modello più comune (s) che ho visto sono

function MyClass(){ 
    this.val = 5; 
}; 
MyClass.prototype.getValue = function() { 
    return this.val; 
} 
MyClass = new MyClass(); 

Ma quando la gente fa che mi chiedo il motivo per cui non basta usare un oggetto letterale

var MyClass = { 
    val: 5, 
    getValue: function() { 
     return this.val; 
    } 
} 

E vorrei anche preferiscono utilizzare il modello di modulo qui

var MyClass = (function(){ 
    var val = 5; 
    return { 
     getValue: function() { 
      return val; 
     } 
    };  
})(); 

responsabilità

Ora se il pattern Singleton deve essere utilizzato, questa è un'altra questione (alla quale la risposta è NO, se vi preoccupate per il test, la gestione delle dipendenze, manutenibilità, la leggibilità)

+0

Qual è l'uso di 'nuova funzione'? – PeeHaa

+0

Non ho notato quella parte, che è sicuramente un po 'strana, lascia che aggiusti la risposta –

+0

Se provi a sovrascrivere MyClass-> val dopo "MyClass = new MyClass()" cosa succede? –

0

Come sembra, questo sostituisce l'oggetto funzione con la nuova istanza

No, non sostituisce nulla. Il nome di un'espressione di funzione (è quello che hai) è accessibile solo all'interno della funzione stessa, non al di fuori di esso. Sarebbe esattamente lo stesso come se si omette il nome:

var myFunc = new function(){}; 

In generale, se non si vuole certi simboli accessibili, solo che non li rendono globale. Definire quei simboli all'interno di una funzione e proprio ritorno ciò che si desidera rendere accessibile, ad esempio:

var myobj = (function() { 
    function Foo() {}; 
    // do whatever 
    return new Foo(); 
}()); 

Tuttavia, se si desidera solo per creare un singolo oggetto, spesso è più facile da usare di un letterale oggetto:

var myobj = {}; 

non v'è alcun motivo per usare una funzione di costruzione se desideri solo per creare una singola istanza da essa.Se vuoi stabilire l'ereditarietà, puoi usare Object.create[MDN]

+0

Ovviamente questo potrebbe essere possibile, ma per motivi di leggibilità, tu non voglio dichiarare l'istanza nello stesso posto del costruttore, questo potrebbe essere un buon modo per farlo ... – user2071276

+0

La variabile ombreggia la funzione con nome, non è vero? –

+0

@Juan: Come ho detto, un'espressione di funzione con nome non crea un simbolo con quel nome nell'ambito di inclusione. Il nome è disponibile solo all'interno della funzione. Prova 'var foo = function bar() {}; alert (bar); '. –