2010-12-22 15 views
6

Date un'occhiata a questa classe di base:Conversione classe C# a JavaScript

namespace AcmeWeb 
{ 
    public string FirstName { get; set; } 

    public class Person 
    { 
     public Person(string firstName, string lastName) 
     { 
      if (String.IsNullOrEmpty(firstName)) 
      { 
       throw new ArgumentNullException(firstName); 
      } 

      this.FirstName = firstName; 
     } 
    } 
} 

Qual è la migliore traduzione di questo in JavaScript?

Questo è quello che sto pensando:

(function(namespace) { 

    namespace.Person = function(firstName, lastName) { 

     // Constructor 

     (function() { 
      if (!firstName) { 
       throw "'firstName' argument cannot be null or empty"; 
      } 
     })(); 

     // Private memberts 

     var _ = { 
      firstName: firstName 
     }; 

     // Public members 

     this.firstName = function(value) { 
      if (typeof(value) === "undefined") { 
       return _.firstName; 
      } 
      else { 
       _.firstName = value; 
       return this; 
      } 
     }; 

    }; 

})(AcmeWeb); 
+2

Prima di tutto, perché lo si converte in JS? Se è perché hai bisogno di quell'oggetto sul client, puoi analizzare la tua classe in JSON e passarla al client, quindi sarai in grado di trattare l'oggetto JSON sul client esattamente come la tua classe sul server. –

+0

Sto solo esplorando rendendo JavaScript più OO. – AgileMeansDoAsLittleAsPossible

+1

C'è qualcosa chiamato Script # che è un compilatore per C# in JavaScript: http://projects.nikhilk.net/ScriptSharp Non l'ho mai provato, ma l'idea mi sembra ottima. –

risposta

3

Si potrebbe utilizzare reali getter/setter in javascript. Vedere John Resig post per ulteriori informazioni. See the fiddle.

(function(NS) { 
    NS.Person = function(firstName, lastName) { 
     if (!firstName) { 
      throw "'firstName' argument cannot be null or empty"; 
     } 

     var FirstName = firstName; 
     this.__defineGetter__("FirstName", function(){ 
      console.log('FirstName getter says ' + FirstName); 
      return FirstName; 
     }); 

     this.__defineSetter__("FirstName", function(val){ 
      console.log('FirstName setter says ' + val); 
      FirstName = val; 
     }); 
    } 
})(AcmeWeb); 

var p = new AcmeWeb.Person('John', 'Smith'); 
p.FirstName;   // => FirstName getter says John 
p.FirstName = 'Joe'; // => FirstName setter says Joe 
+0

Esempio di utilizzo per favore? –

+0

@Kirk Woll - http://jsfiddle.net/jruddell/xhB7E/. L'ho provato solo su Chrome. –

2
var AcmeWeb = { 
    Person: function(firstName, lastName) { 
     if (!firstName) { 
      throw "'firstName' argument cannot be null or empty"; 
     } 
     this.FirstName = firstName; 
    } 
}; 

allora si può nuovo un Person:

var person = new AcmeWeb.Person("john", "smith"); 
+0

Mi piace questa risposta perché a cosa serve un accessore/mutatore qui nel codice JS a parte il fatto di dover chiamare 'person.firstname()' –

2

Dovrebbe essere come

(function(namespace) { 
    namespace.Person = function(firstName, lastName) { 
     var firstName = firstName || 'default', 
      lastName  = lastName || 'default', 
      moarPrivates = 'foo'; 

     return { 
      firstname: function(value) { 
       if(value) { 
        firstName = value; 
        return this; 
       } 
       else { 
        return firstName; 
       } 
      }, 
      lastname: function(value) { 
       if(value) { 
        lastName = value; 
        return this; 
       } 
       else { 
        return lastName; 
       } 
      } 
     }; 
    }; 
}(AcmeWeb)); 

var Andy = AcmeWeb.Person('Andy', 'Foo'); 

Andy.firstname('Andreas').lastname('Baaaaar'); 
console.log('Hello, my name is ', Andy.firstname(), ' ', Andy.lastname()); 

Restituendo sull'oggetto letterale, su tutte le variabili locali i i dalla funzione del costruttore sono chiusi. Questo è il motivo per cui sono privati ​​e accessibili solo dall'oggetto Person. I metodi pubblici sono quelli che si racchiudono nell'oggetto restituito letterale.

Esempio: http://www.jsfiddle.net/GkFu4/1/

+0

ottima risposta !!!! – Nikos