2010-11-14 11 views
36

Puis-je faire quelque chose comme ?:Comment surcharger le constructeur d'un objet dans JS (Javascript)?

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; 
} 

Répondre

34

Vous ne pouvez pas faire cela, puisque JavaScript n'est pas un langage fortement typé il ne verra pas de différence entre le formulaire et userName. Vous pouvez créer plusieurs fonctions comme createUserFromForm(form) et createUserFromUserInfo(userName, password,...) ou vous pouvez essayer d'utiliser un constructeur singulier sans argument spécifié, puis utiliser la collection arguments pour vérifier l'entrée et décider quoi faire.

6

Non, vous ne pouvez pas, JavaScript ne supporte pas le surchargement d'aucune sorte.

Ce que vous pouvez faire est de passer un objet qui a déjà été rempli avec les valeurs dans votre constructeur, puis saisir les valeurs de l'objet, mais ce qui duplique le code.

Ou vous pouvez créer un constructeur par défaut et ajouter des méthodes telles que initFromUser ou setFromForm qui prennent ensuite les paramètres respectifs et configurer les valeurs des objets, new User().initFormForm(form) me semble assez propre.

20

J'aime Ilya réponse Volodins et je pensais que je voudrais ajouter ceci comme exemple:

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

Il y a probablement plus agréables façons de le faire, mais ce juste un exemple.

5

surcharge du constructeur ou toute autre fonction Javascript en comptant le nombre d'arguments:

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

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

Vous pouvez également définir des arguments par défaut en détectant le nombre d'arguments manquent.

0

Vous pouvez facilement simuler des méthodes et des constructeurs surchargés en utilisant une combinaison de chaînes JSON et la commande typeof. Voir l'exemple ci-dessous - vous l'attribut val est formé à partir du type de données entrant:

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;