2013-05-21 26 views
6

Sau khi đọc rất nhiều bài viết về Singleton pattern, và làm một số xét nghiệm, tôi thấy có sự khác biệt giữa mô hình singleton như thế này (http://jsfiddle.net/bhsQC/1/):Javascript Singleton pattern và 'này'

var TheObject = function() { 
    var instance; 

    function init() { 
     var that = this; 
     var foo = 1; 

     function consoleIt() { 
      console.log(that, foo); 
     } 
     return { 
      bar: function() { 
       consoleIt() 
      } 
     }; 
    } 
    return { 
     getInstance: function() { 
      if (!instance) { 
       instance = init(); 
      } 
      return instance; 
     } 
    }; 
}(); 
var myObject = TheObject.getInstance(); 
myObject.bar(); 

và mã như thế này (http://jsfiddle.net/9Qa9H/3/):

var myObject = function() { 
    var that = this; 
    var foo = 1; 

    function consoleIt() { 
     console.log(that, foo); 
    } 
    return { 
     bar: function() { 
      consoleIt(); 
     } 
    }; 
}(); 
myObject.bar(); 

cả hai đều làm cho chỉ có một thể hiện của đối tượng, cả hai đều có thể có các thành viên "tin", that điểm để window đối tượng trong cả hai người. Nó chỉ là thứ hai là đơn giản hơn. Nêu tôi sai vui long chân chỉnh tôi.

Sử dụng constructor tiêu chuẩn như thế này (http://jsfiddle.net/vnpR7/2/):

var TheObject = function() { 
    var that = this; 
    var foo = 1; 

    function consoleIt() { 
     console.log(that, foo); 
    } 
    return { 
     bar: function() { 
      consoleIt(); 
     } 
    }; 
}; 
var myObject = new TheObject(); 
myObject.bar(); 

có lợi thế là sử dụng chính xác that, nhưng không phải là một singleton.

Câu hỏi của tôi là: lợi thế và bất lợi tổng thể của ba cách tiếp cận này là gì? (Nếu có vấn đề, tôi đang làm việc trên một ứng dụng web sử dụng Dojo 1.9, vì vậy, một trong hai cách, đối tượng này sẽ ở bên trong của Dojo require).

+1

Chỉ cần tò mò vì sao một người nào đó sử dụng mẫu đơn trong JavaScript? Nó sẽ không có ý nghĩa để sử dụng một đối tượng như: var obj1 = {} Xin lỗi cho offtopic –

+0

@KirillIvlev với singleton/mô-đun mô-đun bạn có thể có tư nhân vars và chức năng bên trong IIFE. Các singleton từ OP dường như áp dụng tải lười biếng là tốt - chỉ instantiate khi lần đầu tiên được gọi là. –

+0

Tôi chỉ đơn giản là sử dụng một chức năng tự động gọi để ẩn đi hàm tạo, tức là, một cái gì đó như thế này: http://jsfiddle.net/qFMcL/ – Niko

Trả lời

1

Tôi không nghĩ có sự khác biệt thực sự lớn giữa hai người đầu tiên.

Người đầu tiên có getInstance hoạt động giống như một mẫu đơn trong ngôn ngữ OOP cổ điển như Java.

Cách tiếp cận thứ hai hoạt động giống như một lớp tĩnh trong các ngôn ngữ OOP cổ điển.

Rõ ràng các vấn đề cả hai đều giống nhau tất cả các đơn có (rất nhiều tài liệu cho điều này nếu bạn tìm kiếm trên google).

Cách tiếp cận cuối cùng là không thực sự ngay cả khi sử dụng new - bạn đang trả về một đối tượng từ "hàm tạo". Rõ ràng đây không phải là một singleton ở tất cả, và như vậy, sẽ là cách tiếp cận ưa thích.

+0

Tôi đã sẵn sàng để được downvoted cho câu hỏi này, nhưng - "vấn đề" của singletons là gì , ngoài vấn đề 'đó'? Có rất nhiều câu hỏi, nhưng tôi không thể tìm được câu trả lời hay nào. – Zemljoradnik

+1

Đây là một số câu trả lời hay về SO liên quan đến http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons –

3

Vâng, sự khác biệt thực sự là thời điểm xây dựng singleton. Cách tiếp cận thứ hai tạo ra singleton ngay lập tức, lần đầu tiên chỉ sau khi được gọi là lần đầu tiên. Tùy thuộc vào những gì singleton cần trong bộ nhớ, điều này có thể tạo sự khác biệt cho ứng dụng của bạn. Ví dụ, bạn có thể cần singleton chỉ khi người dùng thực hiện một hành động nào đó. Vì vậy, nếu người dùng không làm điều đó, thì nó sẽ được tốt đẹp không phải khởi tạo singleton ở tất cả.

Ngoài ra, nếu việc khởi tạo singleton là cường độ tính toán, đó là một điều tốt để có thể trì hoãn điều đó cho đến khi bạn thực sự cần singleton.

Chỉnh sửa: Và như Jani đã nói, người cuối cùng không phải là singleton, vì vậy tôi đã không thảo luận về nó.

+0

Vâng vâng, tôi đã bỏ lỡ thời gian xây dựng rõ ràng. Trong trường hợp của tôi nó không quan trọng, vì tôi đang sử dụng loại này như một không gian tên. Đó là lý do tại sao tôi bao gồm tùy chọn thứ ba, bởi vì tôi vẫn không chắc chắn tôi nên sử dụng singleton ở tất cả ... – Zemljoradnik

+0

Tất cả các quyền sau đó, tôi không thấy bất kỳ sự khác biệt đáng kể khác. Về thời tiết bạn nên sử dụng một singleton ở tất cả, đó tất nhiên, là một dicussion toàn bộ :) – ghost23

0

Tôi muốn xây dựng độc thân thích này:

function FriendHandler(){ 
    if(FriendHandler.prototype.singleton){ 
     return FriendHandler.prototype.singleton; 
    } 

    if(!(this instanceOf FriendHandler)){ 
     return new FriendHandler(); 
    } 

    FriendHandler.prototype.singleton = this; 
... 
    this.selectFriends = function(firstName){ 
     ... 
    }; 
} 

Nếu bạn làm:

new FriendHandler() 
or 
FriendHandler() 

Nó luôn luôn trả về cùng một ví dụ.

Tôi đã viết về nó một vài tháng trước: http://franciscomsferreira.blogspot.com/2013/01/how-to-write-maintainable-javascript-or.html