2012-01-19 36 views
5

Khi sử dụng mẫu mô-đun trong javascript thì các hàm tạo nên được định nghĩa như thế nào, nếu có. Tôi muốn xây dựng của tôi để phù hợp với một mô hình mô-đun tiêu chuẩn và không được toàn cầu.Constructors trong Mô hình Mô-đun

Tại sao không phải công việc này giống như vậy, nó hoàn chỉnh và vô nghĩa?

var HOUSE = function() { 
    return { 
     Person: function() { 
      var self = this; 
      self.name = "john"; 
      function name() { 
       return self.name; 
      } 
     } 
    }; 
}(); 

var me = new HOUSE.Person(); 
alert(me.name()); 
+0

'self.name' là một chuỗi ' "john"' nên bạn không thể gọi nó. Lưu ý rằng hàm cục bộ 'name' của bạn không được xuất ở bất kỳ đâu. – Raynos

+0

Câu hỏi được cập nhật, nhưng nó đã làm cho một câu trả lời hoàn hảo tốt không có ý nghĩa để thay đổi nó trở lại. – zode64

Trả lời

1

Bạn cần phải đưa phương pháp ra và đính kèm nó vào nguyên mẫu Person. Nhưng khi bạn làm, bạn sẽ có một tài sản tên, và một phương pháp tên, mà sẽ không hoạt động, nên xem xét đổi tên sau này

HOUSE.Person.prototype.getName = function(){ 
    return this.name; 
} 

OR, bạn chỉ có thể gắn nó vào this, và làm cho một getName phương pháp đặc quyền:

Person: function() { 
     this.name = "john"; 
     this.getName = function() { 
      return this.name; 
     } 
    } 
+0

Tôi nghĩ rằng bạn có một vấn đề nhỏ về cú pháp. :) – pimvdb

+0

Vì vậy, gán 'var self = this' vì vậy tôi không thay đổi điều này là không cần thiết? – zode64

+0

Ngoài ra, đây có phải là tư duy tốt hay không? – zode64

2

Sử dụng varfunction foo() {} (sau này là một tuyên bố, có nghĩa là "chỉ" function foo() {} mà không gán nó), tạo ra những biểu tượng của địa phương. Vì vậy, hàm không có sẵn bên ngoài hàm tạo.

Dù bạn muốn để lộ (công khai), bạn nên gán cho this (hoặc self kể từ khi bạn định nghĩa self = this):

self.getName = function() { 
    return self.name; 
}; 

Lưu ý rằng bạn đã sử dụng name, vì vậy tôi đã đưa chức năng tên khác. Nếu bạn muốn đặt chuỗi địa phương name và hiển thị hàm, thì chúng có thể có cùng tên vì không có xung đột. Ví dụ:

var name = "john"; 

self.name = function() { 
    return name; 
}; 
3

Mã của bạn gần như ổn. Tuy nhiên, hàm name() không được công khai nhưng biến đó là do đó bạn đã cố thực thi biến gây ra lỗi. Thêm chức năng getName vào đối tượng và gọi đó là thay vì:

var HOUSE = function() { 
    return { 
     Person: function() { 
      var self = this; 
      self.name = "john"; 
      self.getName = function() { 
       return self.name; 
      } 
     } 
    }; 
}(); 

var me = new HOUSE.Person(); 
alert(me.getName()); 

http://jsfiddle.net/8nSbP/

+1

Đây có phải là thực hành tốt hay không? – zode64

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