2010-11-14 16 views
36

मैं ?: तरहकैसे जे एस (जावास्क्रिप्ट) में एक वस्तु का निर्माता ओवरलोड?

function User(form) { 
    this._username = form.username.value; 
    this._password = form.password.value; 
    this._surname = form.surname.value; 
    this._lastname = form.lastname.value; 
    this._birthdate = form.b_day.value+"-"+form.b_month.value+"-"+form.b_year.value; 
    this._avatar = form.avatar; 
    this._messages = new Array(); 
    this._messagesCount=0; 
} 

function User(userName,password,surname,lastName,birthdate) { 
    this._username = userName; 
    this._password = password; 
    this._surname = surname; 
    this._lastname = lastName; 
    this._birthdate = birthdate; 
    this._avatar = form.avatar; 
    this._messages = new Array(); 
    this._messagesCount=0; 
} 

उत्तर

34

आप ऐसा नहीं कर सकते, क्योंकि जावास्क्रिप्ट एक जोरदार टाइप किया भाषा यह प्रपत्र और उपयोगकर्ता नाम के बीच एक अंतर नहीं देख सकेंगे नहीं है। आप createUserFromForm(form) और createUserFromUserInfo(userName, password,...) जैसे कई समारोह बना सकते हैं या इनपुट की जाँच करें और क्या करना है तय करने के लिए तर्कों का उपयोग संग्रह आपके द्वारा निर्दिष्ट कोई तर्क के साथ एक विलक्षण निर्माता का उपयोग करने की कोशिश कर सकते हैं और फिर।

6

नहीं, तुम नहीं कर सकते हैं कुछ कर सकते हैं, जावास्क्रिप्ट किसी भी तरह का अधिक भार का समर्थन नहीं करता।

आप क्या कर सकते हैं या तो एक वस्तु जो पहले से ही अपने निर्माता में मूल्यों के साथ भर जाने के बाद से पारित और फिर वस्तु से मूल्यों को हड़पने है, लेकिन इस जो कोड डुप्लिकेट।

या आप एक डिफ़ॉल्ट निर्माता बना सकते हैं और विधियों को जोड़ने जैसे initFromUser या setFromForm जो तब संबंधित मानकों और सेटअप वस्तुओं मान लेते हैं, new User().initFormForm(form) मेरे लिए बहुत साफ लग रहा है कर सकते हैं।

20

मैं इल्या Volodins जवाब पसंद है और मुझे लगता है मैं एक उदाहरण के रूप में जोड़ना होगा सोचा:

function foo() { 
    var evt = window.event || arguments[1] || arguments.callee.caller.arguments[0]; 
    var target = evt.target || evt.srcElement; 

    var options = {}; 

    if (arguments[0]) options = arguments[0]; 

    var default_args = { 
     'myNumber'  : 42, 
     'myString'  : 'Hello', 
     'myBoolean'  : true 
    } 
    for (var index in default_args) { 
     if (typeof options[index] == "undefined") options[index] = default_args[index]; 
    } 

    //Do your thing 

} 

//then you call it like this 
foo(); 

//or 

foo({'myString' : 'World'}); 

//or 

foo({'myNumber' : 666, 'myString' : 'World', 'myBoolean' : false}); 

संभवतः हैं ऐसा करने का अच्छा तरीके लेकिन यह सिर्फ एक उदाहरण।

5

अधिभार निर्माता या तर्क की संख्या की गणना के द्वारा किसी अन्य जावास्क्रिप्ट समारोह:

function FooString() 
{ if(arguments.length>0) 
    { this.str=arguments[0]; 
     return; 
    } 
    this.str=""; 
} 

var s1=new FooString; 
var s2=new FooString("hello world"); 

तुम भी पता लगाने के कितने तर्क याद कर रहे हैं कि डिफ़ॉल्ट रूप से तर्क सेट कर सकते हैं।

0

आप आसानी से अतिभारित विधियाँ और कंस्ट्रक्टर JSON तार का एक संयोजन और typeof आदेश का उपयोग कर अनुकरण कर सकते हैं। नीचे उदाहरण देखें - आप वैल एट्रिब्यूट में आने वाले डेटा के प्रकार से आकार लेते हैं:

function test(vals) 
    { 
     this.initialise = function (vals) { 

      if (typeof (vals) == 'undefined') 
      { 
       this.value = 10; 
      } 
      else if (Object.prototype.toString.call(vals) === '[object Array]') 
      { 
       this.value = vals[0]; 
      } 
      else if (typeof (vals) === 'object') { 
       if (vals.hasOwnProperty('x')) { 
        this.value = vals.x; 
       } 
       else if (vals.hasOwnProperty('y')) { 
        this.value = vals.y; 
       } 
      } 
      else { 
       this.value = vals; // e.g. it might be a string or number 
      } 

     } 

     this.otherMethods = function() { 
      // other methods in the class 
     } 

     this.initialise(vals); 
    } 

    var obj1 = test(); // obj1.val = 10; 
    var obj2 = test([30, 40, 50]); // obj1.val = 30; 
    var obj3 = test({ x: 60, y: 70 }); // obj1.val = 60; 
    var obj4 = test({ y: 80 }); // obj1.val = 80; 
    var obj5 = test('value'); // obj1.val = 'value'; 
    var obj6 = test(90); // obj1.val = 90; 
संबंधित मुद्दे