2010-07-22 30 views
5

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 
+1

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

+0

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

Trả lời

0

Kể từ arguments.callee đã bị phản đối tôi nghĩ rằng tôi nên cập nhật câu hỏi này với một ví dụ về những gì tôi đã kết thúc chuyển sang đó là chính xác hơn và cũng tương thích với chế độ nghiêm ngặt.

var Namespace = {}; 

(function() { 
    Namespace.wireup = function self() { 
    self.eventWireup1(); 
    self.eventWireup2(); 
    } 
})(); 

(function (self) { 
    self.eventWireup1 = function() { console.log('first function') } 
    self.eventWireup2 = function() { console.log('second function') } 
})(Namespace.wireup); 
2

ngày là một function() của đối tượng cửa sổ, và bạn đang gắn một hàm để hàm. Thật uh?

Hãy thử điều này:

function a() 
{ 
    return 10; 
} 

a.e = "oO"; 

typeof(a); 
typeof(a.e); 

Để truy cập vào e từ bên trong một bạn có thể sử dụng thuộc tính callee từ lập luận, như:

function a() { 
    return arguments.callee.e; 
} 

a.e = "Oo" 

a(); 
+0

Vâng, thật kỳ lạ; nhưng sau đó Javascript thừa kế nói chung là lạ;) Câu hỏi của tôi là - bạn có thể truy cập vào a.e từ bên trong hàm a() không? Bạn sẽ làm như thế nào mà không cần sử dụng tên đủ điều kiện? –

+0

'arguments.callee' là những gì tôi đang tìm kiếm! Cảm ơn. –