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
).
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 –
@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à. –
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