Mô hình mô-đun tiết lộ (RMP) tạo ra các đối tượng không hoạt động tốt đối với việc ghi đè. Kết quả là, các đối tượng được tạo ra bằng cách sử dụng RMP không hoạt động tốt như các nguyên mẫu. Vì vậy, nếu bạn đang sử dụng RMP để tạo ra các đối tượng sẽ được sử dụng trong một chuỗi thừa kế, chỉ cần không. Quan điểm này là của riêng tôi, trái ngược với những người đề xuất của Mô hình nguyên mẫu tiết lộ.
Để xem các hành vi thừa kế xấu, lấy ví dụ sau đây của một người thợ xây url:
function rmpUrlBuilder(){
var _urlBase = "http://my.default.domain/";
var _build = function(relUrl){
return _urlBase + relUrl;
};
return {
urlBase: _urlBase,
build: _build
}
}
Thiết sang một bên câu hỏi tại sao bạn sẽ sử dụng RMP cho một đối tượng không có thành phần tư nhân, lưu ý rằng nếu bạn lấy đối tượng trả về và ghi đè urlBase bằng "http://stackoverflow.com", bạn sẽ mong đợi hành vi của build() để thay đổi một cách thích hợp. Không, như đã thấy trong những điều sau đây:
var builder = new rmpUrlBuilder();
builder.urlBase = "http://stackoverflow.com";
console.log(builder.build("/questions"); // prints "http://my.default.domain/questions" not "http://stackoverflow.com/questions"
Contrast hành vi với url sau xây dựng thực hiện
function urlBuilder = function(){
return {
urlBase: "http://my.default.domain/".
build: function(relUrl){ return this.urlBase + relUrl;}
}
}
var builder = new urlBuilder();
builder.urlBase = "http://stackoverflow.com";
console.log(builder.build()); // prints "http://stackoverflow.com/questions"
mà cư xử một cách chính xác.
Bạn có thể sửa hành vi kiểu mô-đun của Tiết lộ bằng cách sử dụng phạm vi này như sau đây
function rmpUrlBuilder(){
var _urlBase = "http://my.default.domain/";
var _build = function(relUrl){
return this.urlBase + relUrl;
};
return {
urlBase: _urlBase,
build: _build
}
}
nhưng điều đó chứ không phải đánh bại mục đích của Pattern Mô-đun Tiết lộ. Để biết thêm chi tiết, xem blog của tôi gửi http://ilinkuo.wordpress.com/2013/12/28/defining-return-object-literals-in-javascript/
Kiểm tra bài viết này: http://addyosmani.com/resources/essentialjsdesignpatterns/book/#revealingmodulepatternjavascript có phần bất lợi ở cuối. – nemesv
Mẫu mô-đun dứt khoát cũng vượt qua một số nhược điểm với mô hình mô-đun và mô hình tiết lộ (như khớp nối chặt chẽ với câu lệnh trả về, cách khai báo các hàm công khai và riêng tư, không gian tên không khai báo cho các chương trình con riêng và công khai. chữ với câu lệnh return): http://github.com/tfmontague/definitive-module-pattern – tfmontague