2010-10-10 27 views
6

Tôi hiện đang biết hai cách để xây dựng đơn trong JavaScript. Trước tiên:Làm thế nào để tạo một singleton JavaScript với một hàm tạo mà không sử dụng trở lại?

var singleton = { 
publicVariable: "I'm public", 
publicMethod: function() {} 
}; 

Hoàn hảo ngoại trừ việc nó không có hàm tạo nơi tôi có thể chạy mã khởi tạo.

Thứ hai:

(function() { 

var privateVariable = "I'm private"; 
var privateFunction = function() {} 

return { 
publicVariable: "I'm public", 
publicMethod: function() {} 
} 

})(); 

Phiên bản đầu tiên không có tài sản riêng và cũng không có một constructor, nhưng nó là nhanh hơn và đơn giản hơn. Phiên bản thứ hai phức tạp hơn, xấu xí, nhưng có một hàm tạo và các thuộc tính riêng.

Tôi không có nhu cầu về tài sản riêng tư, tôi chỉ muốn có một nhà xây dựng. Có điều gì tôi thiếu hoặc là hai cách tiếp cận ở trên những cái duy nhất tôi có?

+1

Cách tiếp cận thứ hai không phải là "xấu xí"; đó là một phần tự nhiên của ngôn ngữ. Có khả năng tạo ra các chức năng với các chức năng là một trong những tính năng mạnh mẽ nhất của Javascript. – Pointy

Trả lời

7
function Singleton() { 
    if (Singleton.instance) 
    return Singleton.instance; 
    Singleton.instance = this; 
    this.prop1 = 5; 
    this.method = function() {}; 
}​ 
+0

Tôi nghĩ rằng giải pháp này là không rõ ràng, bởi vì việc sử dụng constructor này là tiếp theo: 'new Singleton()'. Điều này có nghĩa là một nhà phát triển hy vọng sẽ có được một cá thể mới mỗi lần anh ta/cô ấy viết mã này. I E. 'Singleton mới() == new Singleton()' trả về 'true' nhưng phải trả về' false'. – pto3

1
var singleton = new function() { // <<----Notice the new here 
    //constructorcode.... 

    this.publicproperty ="blabla"; 
} 

này về cơ bản là giống như tạo một chức năng, sau đó ngay lập tức assiging một instace mới của nó vào singleton biến. Giống như var singleton = new SingletonObject();

Tôi rất khuyên bạn không nên sử dụng các trình đơn theo cách này trong javscript vì lệnh thi hành dựa trên vị trí trong tệp mà bạn đặt đối tượng chứ không phải trên logic của riêng bạn.

1

Điều này thì sao?

var Singleton = (function() { 
    var instance; 

    // this is actual constructor with params 
    return function(cfg) { 
     if (typeof instance == 'undefined') { 
      instance = this; 
      this.cfg = cfg; 
     } 
     return instance; 
    }; 
})(); 

var a = new Singleton('a'); 
var b = new Singleton('b'); 

//a === b; <-- true 
//a.cfg <-- 'a' 
//b.cfg <-- 'a' 
2

Đây là giải pháp của tôi với đóng cửa:

function Singleton() { 

    Singleton.getInstance = (function(_this) { 
     return function() { return _this; }; 
    })(this); 
} 

Test:

var foo = new Singleton(); 
var bar = Singleton.getInstance(); 
foo === bar; // true 
2

Nếu bạn chỉ là tìm kiếm một nơi để khởi singleton của bạn, làm thế nào về điều này?

var singleton = { 
    'pubvar': null, 
    'init': function() { 
     this.pubvar = 'I am public!'; 
     return this; 
    } 
}.init(); 

console.assert(singleton.pubvar === 'I am public!'); 

Đơn giản và thanh lịch.

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