2010-12-22 18 views
6

Werfen Sie einen Blick auf diese Basisklasse:Konvertieren von C# Klasse 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; 
     } 
    } 
} 

Was ist die beste Übersetzung von dieser in JavaScript?

Das ist, was ich denke:

(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

Vor allem, warum konvertieren es in JS? Wenn Sie das Objekt auf dem Client benötigen, können Sie Ihre Klasse in JSON analysieren und an den Client übergeben. Dann können Sie das JSON-Objekt auf dem Client genau wie Ihre Klasse auf dem Server behandeln. –

+0

Ich bin gerade dabei, JavaScript zu machen, mehr OO. – AgileMeansDoAsLittleAsPossible

+1

Es gibt etwas namens Script #, das ein Compiler für C# zu JavaScript ist: http://projects.nikhilk.net/ScriptSharp Ich habe das noch nie versucht, aber die Idee klingt großartig für mich. –

Antwort

3

Sie echte Getter/Setter in Javascript verwenden könnten. Weitere Informationen finden Sie in John Resigs post. 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

Beispiel Verwendung bitte? –

+0

@Kirk Woll - http://jsfiddle.net/jruddell/xhB7E/. Ich habe das nur in Chrome getestet. –

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

Dann können Sie neue ein Person up:

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

Ich mag diese Antwort, weil was ist ein Accessor/Mutator wirklich hier in der JS-Code wirklich anders als das so tun, müssen Sie 'person.firstname()' –

2

Es sollte wie

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

sein Durch die Rückgabe für Objektliteral alle lokalen Variablen Dateien aus der Konstruktorfunktion werden geschlossen. Deshalb sind sie privat und nur innerhalb des Person-Objekts zugänglich. Die öffentlichen Methoden sind diejenigen, die Sie in das zurückgegebene Objektliteral einschließen.

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

+0

große Antwort aufrufen! – Nikos

Verwandte Themen