2013-06-25 15 views
8

In JavaScript, mi piace la convenzione di denominazione di PascalCase per le funzioni di costruzione e camelCase per altre funzioni. Sembra che ReSharper sia configurato per queste impostazioni. Tuttavia, per il codice come questo:Avvisi reSharper per convenzione di denominazione JavaScript sulle funzioni di costruzione

function Thing(a, b) { 
    return { 
     prop1: a, 
     prop2: b 
    }; 
} 

var thing = new Thing(2, 6); 

... ricevo questo avvertimento:

Nome 'cosa' non non corrisponde regola 'funzione locale'. Il nome suggerito è "cosa".

Non fa differenza se cambio Thing a questo:

function Thing(a, b) { 
    this.prop1 = a; 
    this.prop2 = b; 
} 

Ho il sospetto che solo le funzioni "pubbliche" sono considerati costruttori. Qualcuno di voi sa come ReSharper distingue tra una funzione "Locale" e "Costruttore"? Ancora meglio, sai come sovrascrivere questo comportamento?

risposta

9

Bene, questo è un bug in ReSharper. Puoi aspettare o aggiustarlo da solo. O definirlo in ambito globale.

A proposito, queste funzioni fanno cose molto, molto diverse. Sicuramente non vuoi chiamare il primo costruttore.

+0

Grazie per aver trovato la segnalazione di errore. Ho una domanda però: come è la funzione precedente * not * a constructor? Se una funzione restituisce un valore quando viene chiamato con 'new', quel valore restituito diventa" questo "per l'oggetto creato. Inoltre, scrivendo in questo modo, si ottiene lo stesso risultato sia che lo si chiami con 'nuovo' o senza. – Jacob

+1

@Jacob perché non costruisce oggetti di "Cosa", restituisce oggetti di "Oggetto". In JS un costruttore può restituire un'istanza di qualsiasi "classe" e restituire un oggetto letterale è un caso particolare in cui tale funzione consente di negare del tutto il punto di costruttori e prototipi. – Esailija

+0

Ha senso. Grazie per la spiegazione. – Jacob

0

se si desidera che il costruttore sia pubblico, è possibile utilizzare questa soluzione:

(function(global){ 

    function kindOfPrivateFunction(thing){ 
     //Do something with thing 
    } 

    global.Thing = function(a, b) { 
     this.prop1 = a; 
     this.prop2 = b; 

     knindOfPrivateFunction(this); 
    }; 

    global.Thing.publicFunction = function() { }; 

})(this); 

Oppure, se non si vuole ReSharper a lamenta "ThisInGlobalContext":

(function(){ 

    function kindOfPrivateFunction(thing){ 
     //Do something with thing 
    } 

    this.Thing = function(a, b) { 
     this.prop1 = a; 
     this.prop2 = b; 

     knindOfPrivateFunction(this); 
    }; 

    this.Thing.publicFunction = function() { }; 

})(); 

Modifica

Considerando che la classe deve essere locale, è possibile utilizzare un oggetto locale per "memorizzare" il costruttore locale. Ma è davvero solo un trucco per spegnere Resharper ...

(function(){ 

    var local = {}; 

    function kindOfPrivateFunction(thing){ 
     //Do something with thing 
    } 

    local.Thing = function(a, b) { 
     this.prop1 = a; 
     this.prop2 = b; 

     knindOfPrivateFunction(this); 
    }; 

    local.Thing.prototype.publicFunction = function() { }; 

    var instance = new local.Thing(1, 2); 

})(); 
+0

Grazie per il suggerimento. Non voglio che il mio costruttore sia globale. La mia domanda riguardava ReSharper che si lamentava della nomina di costruttori che * non sono * pubblici. – Jacob

Problemi correlati