2014-11-20 7 views
9

वर्तमान में मैं एक परियोजना जहाँ हम ऑब्जेक्ट ओरिएंटेड जावास्क्रिप्ट लिख रहे हैं में काम कर रहा हूँ।का उपयोग प्रोटोटाइप जावास्क्रिप्ट - सबसे अच्छा अभ्यास

1: इस परियोजना में मैं एक वर्ग को परिभाषित करने के दो अलग अलग तरीकों को देखा है प्रोटोटाइप

My.Namespace.ClassName = function(param1, param2) { 
    this.member1 = param1; 
    this.member2 = param2; 
}; 

My.Namespace.ClassName.prototype = { 
    myFunction1: function() { 
     return this.member1 + " " + this.member2; 
    }, 

    myFunction2: function(param1) { 
     this.member3 = paraml; 
    } 
}; 

2 पर एक बार में काम करता है घोषित: प्रोटोटाइप

My.Namespace.ClassName = function(param1, param2) { 
    this.member1 = param1; 
    this.member2 = param2; 
}; 

My.Namespace.ClassName.prototype.myFunction1 = function() { 
    return this.member1 + " " + this.member2; 
}; 

My.Namespace.ClassName.prototype.myFunction2 = function(param1) { 
    this.member3 = paraml; 
}; 

पर प्रत्येक कार्य अलग-अलग तैयार करें क्या जावास्क्रिप्ट दो दिए गए उदाहरणों के आधार पर व्यवहार करता है या यह केवल एक शैली अंतर है?

व्यक्तिगत तौर पर मैं किसी भी व्यवहार अंतर नहीं देखा है, लेकिन मैं लग रहा है कि वहाँ एक सूक्ष्म अंतर जो मैं वर्तमान में याद आ रही है होना चाहिए है।

इसके अलावा। मैं जानना चाहता हूं कि यह एक आम प्रथा है या कक्षाओं को परिभाषित करने के लिए बेहतर तरीके हैं।

उत्तर

8

एक सूक्ष्म अंतर नहीं है। पहली विधि में, जब आप प्रोटोटाइप को ओवरराइट करते हैं, वहां एक ऐसी संपत्ति थी जो अब खो गई है। यह constructor है, जो आपके फ़ंक्शन पर वापस इंगित करता है। कन्स्ट्रक्टर आपको ऑब्जेक्ट के प्रकार को फिर से बनाने की अनुमति देता है।

आप आसानी से इसे वापस प्राप्त करने और इतने मैन्युअल रूप से इसे निर्धारित करके पहली विधि का उपयोग: भी

My.Namespace.ClassName.prototype = { 
    myFunction1: function() { 
     return this.member1 + " " + this.member2; 
    }, 

    myFunction2: function(param1) { 
     this.member3 = paraml; 
    }, 
    constructor: My.Namespace.ClassName 
}; 

देखें: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor

+0

तुम क्या आप _In साथ पहली विधि मतलब और अधिक विस्तार से व्याख्या कर सकते हैं, जब आप प्रोटोटाइप को ओवरराइट करते हैं, वहां एक ऐसी संपत्ति थी जो अब खो गई है। क्या आपका मतलब है कि 'var.Namespace.ClassName.constructor' में' var obj = new My.Namespace.ClassName ("value1", "value2") को कॉल करने से पहले और बाद में कोई अंतर है? – hwcverwe

+0

नहीं - 'My.Namespace.ClassName.prototype' 'कन्स्ट्रक्टर' संपत्ति के साथ आता है। जब आप प्रोटोटाइप को ओवरराइट करते हैं, तो कन्स्ट्रक्टर खो जाता है। – Scimonster

+0

स्वीकृत लेकिन एक प्रश्न हालांकि: क्या मैं दोनों शैलियों को जोड़ सकता हूं या इससे कहीं समस्याएं पैदा हो सकती हैं? – hwcverwe

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