2013-06-25 2 views
8

जावास्क्रिप्ट में, मुझे अन्य कार्यों के लिए कन्स्ट्रक्टर फ़ंक्शन और ऊंटकेस के लिए पास्कलकेज़ के नामकरण सम्मेलन पसंद है। ऐसा लगता है कि ReSharper इन सेटिंग्स के लिए कॉन्फ़िगर किया गया है। हालांकि, इस तरह कोड के लिए:कन्स्ट्रक्टर फ़ंक्शंस पर जावास्क्रिप्ट नामकरण सम्मेलन के लिए रीशेर्पर चेतावनियां

नाम 'थिंग' नियम 'स्थानीय समारोह' से मेल नहीं नहीं करता है:

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

var thing = new Thing(2, 6); 

... मैं इस चेतावनी प्राप्त करते हैं। सुझाया गया नाम 'चीज़' है।

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

मुझे लगता है कि केवल "सार्वजनिक" कार्यों कंस्ट्रक्टर्स माना जाता है:

यह अगर मैं इस के लिए Thing बदल कोई फर्क नहीं है। क्या आप में से कोई भी जानता है कि रीशेर्पर कैसे "स्थानीय" और "कन्स्ट्रक्टर" फ़ंक्शन के बीच अंतर करता है? इससे भी बेहतर, क्या आप जानते हैं कि इस व्यवहार को कैसे ओवरराइड करना है?

उत्तर

9

ठीक है, यह ReSharper में bug है। आप इसे स्वयं इंतजार कर सकते हैं या ठीक कर सकते हैं। या इसे वैश्विक दायरे में परिभाषित करें।

बीटीडब्ल्यू, वे कार्य बहुत ही अलग चीजें करते हैं। आप निश्चित रूप से पूर्व निर्माता को कॉल नहीं करना चाहते हैं।

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

यदि आप नहीं करते ReSharper करना चाहते हैं "ThisInGlobalContext" के बारे में शिकायत या,:

+0

बग रिपोर्ट खोजने के लिए धन्यवाद। मेरे पास एक सवाल है हालांकि: पूर्व कार्य * कन्स्ट्रक्टर * कैसे नहीं है? यदि कोई फ़ंक्शन 'नया' के साथ कॉल करते समय मान देता है, तो लौटाया गया मान बनाया गया ऑब्जेक्ट के लिए "यह" बन जाता है। इसके अलावा, इसे इस तरह लिखते हुए, आपको वही परिणाम मिलता है चाहे आपने इसे 'नया' या बिना कहा। – Jacob

+1

@ जैकोब क्योंकि यह 'थिंग' की वस्तुओं का निर्माण नहीं करता है, यह 'ऑब्जेक्ट' की ऑब्जेक्ट देता है। जेएस में एक कन्स्ट्रक्टर किसी भी "वर्ग" का एक उदाहरण वापस कर सकता है, और ऑब्जेक्ट शाब्दिक लौटने का एक विशेष मामला है जहां यह सुविधा किसी को कन्स्ट्रक्टर और प्रोटोटाइप के बिंदु को पूरी तरह से अस्वीकार करने की अनुमति देती है। – Esailija

+0

समझ में आता है। स्पष्टीकरण के लिए धन्यवाद। – Jacob

0

अगर आप अपने निर्माता सार्वजनिक होना चाहते हैं, तो आप इस समाधान का उपयोग कर सकते हैं

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

})(); 

संपादित करें

आपकी कक्षा को स्थानीय मानना ​​चाहिए, आप स्थानीय कन्स्ट्रक्टर को "स्टोर" करने के लिए स्थानीय ऑब्जेक्ट का उपयोग कर सकते हैं। लेकिन यह वास्तव में केवल एक हैक है जो रिशेर्पर को बंद करने के लिए है ...

(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

टिप के लिए धन्यवाद। मैं नहीं चाहता कि मेरा कन्स्ट्रक्टर वैश्विक हो। मेरा सवाल रेसर्पर के बारे में शिकायतकर्ताओं के नामकरण के बारे में शिकायत करना था जो * सार्वजनिक नहीं हैं। – Jacob

संबंधित मुद्दे