2010-12-22 13 views
6

Eche un vistazo a esta clase básica:conversión de clase C# tener 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; 
     } 
    } 
} 

Cuál es la mejor traducción de esto en JavaScript?

Esto es lo que estoy 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

En primer lugar, ¿por qué se está convirtiendo a JS? Si es porque necesita ese objeto en el Cliente, puede analizar su clase en JSON y pasarla al cliente, entonces podrá tratar el objeto JSON en el cliente exactamente como su clase en el servidor. –

+0

Solo estoy explorando para hacer que JavaScript sea más OO. – AgileMeansDoAsLittleAsPossible

+1

Hay algo llamado Script # que es un compilador para C# a JavaScript: http://projects.nikhilk.net/ScriptSharp. Nunca lo he intentado, pero la idea me parece genial. –

Respuesta

3

Se puede usar getters/setters reales en javascript. Consulte John Resig's post para obtener más información. 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

¿Uso de la muestra por favor? –

+0

@Kirk Woll - http://jsfiddle.net/jruddell/xhB7E/. Solo probé esto en Chrome. –

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

A continuación, puede una nueva Person:

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

Me gusta esta respuesta porque de qué sirve un accededor/mutador realmente haciendo aquí en el código JS aparte de hacerlo así que tienes que llamar a 'person.firstname()' –

2

Debe ser como

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

Devolviendo en objeto literal, toda variab local Los archivos de la función constructora están cerrados. Es por eso que son privados y solo accesibles desde el objeto Persona. Los métodos públicos son aquellos que encierra en el literal del objeto que regresa.

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

+0

¡¡excelente respuesta !!!! – Nikos