2011-08-21 32 views
7

Tôi đang cố tạo và phản đối kế thừa từ đối tượng Ngày tháng.Làm thế nào để kế thừa từ đối tượng ngày Javascript?

Dưới đây là bảng điểm Firebug về những gì tôi đang cố gắng thực hiện.

>>> date_son = Object.create(Date) 
Function {} 
>>> typeof date_son 
"object" 
>>> date_son.gettime 
undefined 
>>> date_son.prototype.getTime 
getTime() 

Tôi sử dụng Object.create để tạo đối tượng date_son kế thừa từ Ngày. Hàm getTime/attribute có sẵn trên date_son.protype, nhưng không có trên đối tượng date_son.

Tôi rõ ràng đang làm điều gì đó sai. Bất cứ ai có thể chỉ cho tôi đi đúng hướng về cách tạo một đối tượng kế thừa từ Date để date_son.getTime() có sẵn trên đối tượng date_son.

Tôi không muốn gia hạn Ngày trực tiếp, bởi vì tôi nghĩ rằng việc làm rối/thay đổi hình cầu là thực hành lập trình kém.

+2

Javascript phân biệt chữ hoa chữ thường. Bạn đang tương phản 'date_son.gettime' với' date_son.prototype.getTime'; chú ý sự khác biệt về cách viết hoa. –

+2

Nó sẽ vẫn là 'undefined' vì' Date' là đối tượng 'Function', không phải là đối tượng' Date'. – user113716

+1

Thay vào đó, bạn có thể mở rộng từ 'Date.prototype' và nó sẽ cung cấp cho bạn các phương thức, nhưng tôi không biết bạn sẽ làm gì tốt, bởi vì chúng sẽ không hoạt động trên đối tượng Date khi bạn gọi chúng. – user113716

Trả lời

1

Bạn có thể làm điều này:

var date_son = Object.create(Date.prototype); 

nhưng nó không có vẻ sẽ làm nhiều tốt vì bạn sẽ được gọi những phương pháp trên một cái gì đó khác hơn là một Date.

console.log(date_son.getTime()); // won't work 

Bạn có thể gọi nó như thế này, nhưng tôi không biết lý do tại sao bạn muốn:

var date_son = Object.create(Date.prototype); 

var new_date = new Date(); 

console.log(date_son.getTime.call(new_date)); // 1313964470748 

Nếu bạn muốn thêm một số tiện ích ngày, và bạn không muốn mở rộng Date.prototype, sau đó chỉ cần tạo một thư viện các phương thức chấp nhận đối tượng Date.

var date_son = { 
    some_method: function(d) { 
     // do something with the date 
     return d; 
    } 
}; 

var date = date_son.some_method(new Date); 
+0

Tại sao bạn trả lời hai lần? :( – Raynos

+0

@Raynos: Tôi thực sự thích nhìn thấy avatar của mình! Thực ra, câu trả lời ban đầu của tôi đơn giản là cung cấp giải pháp 'var date_son = Object.create (Date.prototype);' mà không cân nhắc xem nó có phải là giải pháp hữu ích hay không. truy cập vào các phương thức, nhưng chúng vô ích đối với những gì tôi giả định OP dự định – user113716

2

Có một lưu ý trên MDN Documents bởi Mozilla (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date):

Lưu ý: Lưu ý rằng đối tượng ngày chỉ có thể được khởi tạo bằng cách gọi ngày hoặc sử dụng nó như là một nhà xây dựng; không giống như các loại đối tượng JavaScript khác, các đối tượng Date không có cú pháp theo nghĩa đen.

Object.create mong đợi một trường hợp khi có thông số. Date không có cá thể riêng và do đó sẽ không hoạt động với Object.create.

Ngoài ra, để giải quyết vấn đề của bạn với việc mở rộng Ngày trực tiếp:

Mở rộng đối tượng gốc là một thứ được thực hiện thường xuyên.MooTools làm nó ví dụ với .implement phương pháp riêng của họ:

https://github.com/mootools/mootools-more/blob/master/Source/Types/Date.js#L55

Hướng dẫn về người bản địa mở rộng:

http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-how-to-extend-built-in-objects-in-javascript/

Sửa:

Và một bài viết về tệ nạn đoán về mở rộng người bản xứ: http://perfectionkills.com/extending-built-in-native-objects-evil-or-not/

+1

'Object.create' không mong đợi một đối tượng theo nghĩa đen, nó mong đợi một cá thể của bất kỳ đối tượng nào. Ví dụ,' Object.create ([1, 2, 3]) 'hoạt động tốt, cũng như' var x = [1, 2, 3]; Object.create (x) 'hoặc' Object.create (số mới (3)) '. – Domenic

+0

Cảm ơn, tôi đã chỉnh sửa Có chữ và dụ trộn lên. – Luwe

Các vấn đề liên quan