2013-06-25 12 views
8

W JavaScript, podoba mi się konwencja nazw PascalCase dla funkcji konstruktora i camelCase dla innych funkcji. Wygląda na to, że ReSharper jest skonfigurowany dla tych ustawień. Jednak dla kodu:Ostrzeżenia ReSharper dotyczące konwencji nazewnictwa JavaScript na funkcje konstruktora

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

var thing = new Thing(2, 6); 

... Otrzymuję to ostrzeżenie:

Nazwa „rzecz” nie nie pasujące do zasady „Local funkcji”. Sugerowana nazwa to "rzecz".

To nie robi różnicy, jeśli zmienię Thing do tego:

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

Podejrzewam, że tylko funkcje „publiczne” są uważane konstruktorów. Czy ktokolwiek wie, w jaki sposób ReSharper rozróżnia funkcję "Lokalny" i "Konstruktor"? Nawet lepiej, wiesz jak nadpisać to zachowanie?

Odpowiedz

9

Cóż, jest to bug w ReSharper. Możesz poczekać lub naprawić samodzielnie. Lub zdefiniuj go w zasięgu globalnym.

Btw, funkcje te robią bardzo, bardzo różne rzeczy. Na pewno nie chcesz nazwać byłego konstruktorem.

+0

Dzięki za znalezienie zgłoszenia błędu. Mam jednak pytanie: w jaki sposób poprzednia funkcja * nie * jest konstruktorem? Jeśli funkcja zwraca wartość przy wywołaniu z 'new', to zwrócona wartość staje się" tym "dla tworzonego obiektu. Plus, pisząc to w ten sposób, otrzymujesz taki sam wynik, niezależnie od tego, czy wywołasz go z 'new' czy bez. – Jacob

+1

@Jacob, ponieważ nie tworzy obiektów 'Thing', zwraca obiekty obiektu' Object'. W JS konstruktor może zwrócić instancję dowolnej "klasy", a powracający literał obiektowy jest szczególnym przypadkiem, w którym funkcja ta umożliwia całkowite zanegowanie punktu konstruktorów i prototypów. – Esailija

+0

Ma sens. Dziękuję za wyjaśnienie. – Jacob

0

jeśli chcesz konstruktor być publiczne, można korzystać z tego rozwiązania:

(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); 

Lub, jeśli nie chcesz, aby ReSharper narzeka "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() { }; 

})(); 

Edycja

Biorąc pod uwagę, że twoja klasa musi być lokalna, możesz użyć lokalnego obiektu do "przechowywania" lokalnego konstruktora. Ale to naprawdę tylko hack do odcięcia 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

Dzięki za napiwek. Nie chcę, aby mój konstruktor był globalny. Moje pytanie dotyczyło ReSharper narzekającego na nazewnictwo konstruktorów, które * nie są * publiczne. – Jacob

Powiązane problemy