2012-11-08 44 views
5

कहो मैं निम्नलिखित एपीआई बनाना चाहते हैं बनाओ ताकि इस काम करेगा:नई कीवर्ड वैकल्पिक

api().method(); 

मैं अपने सिर से बाहर करना होगा:

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

लेकिन मैं सोच रहा था, क्या यह आसानी से संक्रमित हो सकता है, या इस विधि का उपयोग करके अन्य खतरे हैं? मुझे पता है कि f.ex jQuery ऐसा नहीं करता है (वे एक प्रोटोटाइप विधि में कन्स्ट्रक्टर को ऑफ़लोड करते हैं), इसलिए मुझे यकीन है कि ऐसा करने के लिए कोई अच्छा कारण नहीं है। मैं बस उन्हें नहीं जानता।

+1

आपका समाधान बिल्कुल ठीक दिखता है, मैंने देखा है कि कई स्थानों पर उपयोग किया जा रहा है। [यहां] देखें (http://ejohn.org/blog/simple-class-instantiation/), उदाहरण के लिए। – bfavaretto

उत्तर

2

कन्स्ट्रक्टर फ़ंक्शन में कोई ऑब्जेक्ट लौटाएं।

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

'ऑब्जेक्ट.क्रेट (...)' विशेष रूप से अच्छा है क्योंकि यह पूछताछ पर मजबूती का उपयोग करता है और कन्स्ट्रक्टर में 'इस' के किसी भी संदर्भ को समाप्त करता है, इसलिए आपको इस बारे में तर्क करने की आवश्यकता नहीं है कि यह 'कन्स्ट्रक्टर संदर्भ' में क्या है । तरीकों के मुताबिक अभी भी 'इस' तक पहुंच होगी। – Eric

-1

एक या दूसरे सम्मेलन को चुनें। यदि आप अपने एपीआई हैंडल के लिए ऑब्जेक्ट्स का उपयोग करना चाहते हैं, लेकिन नहीं चाहते कि लोगों को new का उपयोग करना पड़े, तो दो फ़ंक्शंस का उपयोग करें। Api() जो ऑब्जेक्ट्स के लिए एक कन्स्ट्रक्टर है, और api() यह एक नियमित फ़ंक्शन है जो केवल एक नया Api उदाहरण देता है।

मुझे नहीं लगता कि आपके प्रस्ताव के लिए कोई खतरा है, यह केवल व्यर्थ लगता है और मुझे एक बार में दो चीजें करने का विचार पसंद नहीं है।

+1

'नया' वैकल्पिक बनाना टीमों को एपीआई का उपयोग इस तरह से करने के लिए करता है जो अपने स्वयं के सम्मेलनों को फिट करता है। कुछ टीमें अपने गठिया के कारण 'नई' के खिलाफ दृढ़ता से हैं और अन्य इसे विरासत के साथ भाषाओं के समान अनुभव के लिए उपयोग करते हैं। यह अच्छा होगा अगर एपीआई ने टीमों को इस तरह के सम्मेलनों को तोड़ने के लिए मजबूर नहीं किया। Express.js की 'राउटर' कक्षा वैकल्पिक 'नई' का एक अच्छा उदाहरण है। – Eric