2010-12-22 65 views
6

Hãy nhìn vào lớp cơ bản này:Chuyển đổi C# lớp 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; 
     } 
    } 
} 

bản dịch tốt nhất này vào hoạt Javascript là gì?

Đây là những gì tôi đang suy nghĩ:

(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

Trước hết, tại sao chuyển đổi thành JS? Nếu nó là vì bạn cần đối tượng đó trên Máy khách, bạn có thể phân tích lớp của bạn thành JSON và chuyển nó cho máy khách, thì bạn sẽ có thể xử lý đối tượng JSON trên máy khách giống như lớp của bạn trên máy chủ. –

+0

Tôi chỉ đang khám phá việc tạo thêm OO cho JavaScript. – AgileMeansDoAsLittleAsPossible

+1

Có một cái gì đó gọi là Script # đó là một trình biên dịch cho C# để JavaScript: http://projects.nikhilk.net/ScriptSharp Tôi đã không bao giờ cố gắng này, nhưng ý tưởng âm thanh tuyệt vời với tôi. –

Trả lời

3

Bạn có thể sử dụng getters/setters thực trong javascript. Xem số post của John Resig để biết thêm thông tin. 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

Sử dụng mẫu xin vui lòng? –

+0

@Kirk Woll - http://jsfiddle.net/jruddell/xhB7E/. Tôi chỉ thử nghiệm điều này trong Chrome. –

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

Sau đó, bạn có thể mới lên một Person:

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

Tôi thích câu trả lời này bởi vì những gì tốt là một accessor/mutator thực sự làm ở đây trong mã JS khác hơn là làm như vậy bạn phải gọi 'person.firstname()' –

2

Nó phải là như

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

Bằng trở về trên đối tượng theo nghĩa đen, tất cả variab cục bộ les từ hàm xây dựng được đóng lại. Đó là lý do tại sao chúng là riêng tư và chỉ có thể truy cập từ bên trong đối tượng Person. Các phương thức công khai là những phương thức mà bạn gửi kèm vào đối tượng trả về theo nghĩa đen.

Ví dụ: http://www.jsfiddle.net/GkFu4/1/

+0

câu trả lời tuyệt vời !!!! – Nikos

Các vấn đề liên quan