Tôi đã thử nghiệm với một mẫu thiết kế trong Javascript cho phép tôi có những chức năng đơn lẻ có thể bị ghi đè bởi các hàm mẫu.Câu hỏi kế thừa Javascript (hơi tối nghĩa)
Dưới đây là một ví dụ ngắn gọn:
Date.tomorrow = function() {
return Date.today().add(1).days();
}
(function(p) {
p.tomorrow = function() {
var date = this.clone().clearTime();
return date.equals(Date.tomorrow());
}
})(Date.prototype);
Vì vậy, có hai tomorrow()
chức năng. Khi gọi từ ngày chức năng trực tiếp:
>>> Date.tomorrow()
=> Fri Jul 23 2010 00:00:00 GMT-0500 (CST) { _orient=1, more...}
Nhưng khi bạn khởi tạo một ngày sơ thẩm:
>>> var date = new Date()
>>> date.tomorrow()
=> false
Tôi bỏ quên nhiều điều như tôi chắc chắn rằng bạn có thể nói, nhưng hy vọng bạn đạt mục đích. Câu hỏi của tôi là: mối quan hệ của hàm tomorrow()
đầu tiên với đối tượng Ngày tháng là gì? Nó gắn liền với cái gì?
Giả sử bạn đang làm điều này với chức năng bình thường không được dự định là nhà xây dựng. Có thể gọi chức năng tăng cường từ bên trong chức năng gốc không?
Trong một hàm constructor bạn có thể làm điều này:
this.constructor.functionName();
nhưng nếu chức năng không được sử dụng như một nhà xây dựng, rõ ràng các constructor
tham khảo sẽ không tồn tại. Có cách nào khác để truy cập chức năng tăng cường đó không?
Động lực đằng sau câu hỏi này xuất phát từ công việc của tôi sắp xếp lại mã JS cho một dự án. Chúng tôi đang triển khai hệ thống Sprockets để chia mã nguồn thành các mô-đun, trong đó cơ bản là trang trí vùng tên cơ sở khi chúng ta thay vì đóng gói tất cả lại với nhau trong một định nghĩa đối tượng nội tuyến không thể đọc được.
Chúng tôi có một số sự kiện khá lớn về mặt sự kiện, rất tốt để chia thành các chức năng riêng biệt, nhưng tôi không muốn phải gọi từng chức năng riêng lẻ; thay vào đó tôi muốn có một chức năng siêu cấp gọi tất cả các chức năng phụ trong một lần.
Tôi luôn có thể tạo một hàm all()
hoặc một cái gì đó để đạt được điều này, nhưng nó sẽ trông sạch hơn rất nhiều so với quan điểm API nếu gọi một hàm mức cao nhất đã thực hiện tất cả các hàm phụ đã được đính kèm với nó.
Cảm ơn phản hồi của Francisco Tôi hiện đang triển khai thực hiện những gì tôi đang nghĩ đến. Đây là một ví dụ trong trường hợp ai đó tò mò.
var Namespace = {};
var Namespace.wireup = (function() {
return function() {
var self = arguments.callee;
self.eventWireup1();
self.eventWireup2();
};
})();
(function (W) {
function eventWireup1() { console.log('first function'); };
function eventWireup2() { console.log('second function'); };
$.extend(W, {
eventWireup1: eventWireup1,
eventWireup2: eventWireup2
});
})(Namespace.wireup);
Lợi ích của API này là bạn có thể làm điều này:
>>> Namespace.wireup.eventWireup1();
=> first function
>>> Namespace.wireup.eventWireup2();
=> second function
>>> Namespace.wireup();
=> first function
=> second function
Chỉ vì tò mò; bạn đã xem Yahoo! Thư viện sự kiện? Tôi biết nó không cụ thể những gì bạn đang hỏi về ... nhưng nó có vẻ như những gì bạn đang yêu cầu cho bạn có thể không cần nếu bạn đã có một thay thế phong nha? (http://developer.yahoo.com/yui/event/) – Steve
@Steve câu hỏi của tôi không thực sự liên quan đến sự kiện ràng buộc cho mỗi se, mà là một dạng mô-đun hóa. Có một số loại sự kiện kết nối mà tôi muốn có thể gọi cả hai ngầm và rõ ràng. Plus Tôi đã sử dụng jQuery cho các sự kiện mà tôi thích tốt hơn YUI cá nhân. –