Tôi biết tôi đã trễ gần ba năm, nhưng hy vọng các độc giả tương lai của câu hỏi này có thể hưởng lợi từ câu trả lời của tôi. Câu trả lời của GSto trông tuyệt vời từ quan điểm thiết kế plugin jQuery, nhưng có một vấn đề nhỏ: gọi mynamespace()
ghi đè trường hợp jQuery đã trả về bằng các phương thức mới. Dưới đây là một ví dụ về điều đó trở thành một vấn đề:
$myDiv = $('.mydiv');
$myDiv.mynamespace().height(); // this will be `height' from mynamespace
$myDiv.height(); // this will STILL be `height' from mynamespace
// because it has overwritten $myDiv.height
Câu trả lời được lựa chọn không có vấn đề này bởi vì có amtec()
không phải là một trường hợp jQuery và là thay vì một đối tượng mà các cuộc gọi phương thức của nó với các trường hợp jQuery như bối cảnh. Tôi đã lấy khái niệm của cả hai câu trả lời và viết các plugin không gian tên dưới đây:
(function($) {
$.namespace = function(namespaceName, closures) {
if ($.fn[namespaceName] === undefined) {
$.fn[namespaceName] = function executor(context) {
if (this instanceof executor) {
this.__context__ = context;
}
else {
return new executor(this);
}
};
}
$.each(closures, function(closureName, closure) {
$.fn[namespaceName].prototype[closureName] = function() {
return closure.apply(this.__context__, arguments);
};
});
};
})(jQuery);
Ví dụ sử dụng:
$.namespace('milosz', {
redify: function() {
$(this).css('color', '#ff0000');
},
greenify: function() {
$(this).css('color', '#00ff00');
}
});
$.namespace('milosz', {
blueify: function() {
$(this).css('color', '#0000ff');
}
});
$('.mydiv').milosz().redify(); // The HTML elements with class `mydiv' are now red
Mã này sử dụng một số chi tiết ở mức độ thấp khá JavaScript đều được giải thích bởi John Resig's Advanced JavaScript tutorial, nhưng nói một cách lỏng lẻo những gì đang xảy ra trong ví dụ này là:
Khi milosz
(nội bộ $.fn[namespaceName]
) được gọi, this
trỏ đến trường hợp jQuery
được trả về b y $('.mydiv')
.Do đó, câu lệnh if
rơi qua khối else
và phiên bản hàm xây dựng của milosz
được gọi (được gọi nội bộ là executor
vì các lý do sắp trở nên rõ ràng). Hàm khởi tạo được chuyển một tham số duy nhất: this
, một con trỏ đến jQuery
trường hợp sẽ là ngữ cảnh thực thi cho tất cả các thành viên của không gian tên milosz
. Chúng ta nhập trở lại câu lệnh if
, lần này thực hiện khối đầu tiên, trong đó phiên bản jQuery
được chuyển vào được lưu trữ trong biến thành viên được gọi là __context__
(hy vọng có khả năng bị ghi đè thấp). Đối tượng được xây dựng được trả lại, hoàn chỉnh với tham chiếu đến phiên bản gốc jQuery
và bất kỳ trình bao bọc nào được thêm vào mẫu thử nghiệm của nó bằng cách gọi số $.namespace
. Những trình bao bọc này chỉ thực hiện các phương thức được truyền vào không gian tên milosz
với đối tượng jQuery
gốc dưới dạng ngữ cảnh, như xảy ra khi redify
được thực hiện.
Bah, tôi biết nó là một ngụm, dù sao vấn đề là nó hoạt động giống như câu trả lời được chấp nhận nhưng trông giống như câu trả lời jQueryish, mà với tôi là tốt nhất của cả hai thế giới.
bạn vui lòng xem giải pháp của mình. nó chính xác hơn với những gì bạn đang cố gắng đạt được. –