Lý do không bao giờ được gọi là vì bạn đang thay đổi thuộc tính constructor
trên Date.prototype
. Tuy nhiên, bạn có thể vẫn đang tạo ngày sử dụng mã new Date()
. Vì vậy, nó không bao giờ sử dụng constructor của bạn. Những gì bạn thực sự muốn làm là tạo ngày của bạn constructor riêng:
function MyDate() {
var d = Date.apply(Date, arguments);
if ((arguments.length == 3 || arguments.length == 6)
&& (arguments[0] < 100 && arguments[0] >= 0)) {
d.setFullYear(arguments[0]);
return d;
}
Sau đó, bạn có thể tạo ngày mới của bạn như thế này:
var d = MyDate();
Edit: Thay vì sử dụng Date.apply
tôi thà sử dụng theo chức năng instantiate
cho phép bạn apply arguments to a constructor function:
var bind = Function.bind;
var unbind = bind.bind(bind);
function instantiate(constructor, args) {
return new (unbind(constructor, null).apply(null, args));
}
Đây là cách tôi sẽ thực hiện các nhà xây dựng ngày mới:
function myDate() {
var date = instantiate(Date, arguments);
var args = arguments.length;
var arg = arguments[0];
if ((args === 3 || args == 6) && arg < 100 && arg >= 0)
date.setFullYear(arg);
return date;
}
Edit: Nếu bạn muốn ghi đè Ngày constructor mẹ đẻ thì bạn phải làm một cái gì đó như thế này:
Date = function (Date) {
MyDate.prototype = Date.prototype;
return MyDate;
function MyDate() {
var date = instantiate(Date, arguments);
var args = arguments.length;
var arg = arguments[0];
if ((args === 3 || args == 6) && arg < 100 && arg >= 0)
date.setFullYear(arg);
return date;
}
}(Date);
Nguồn
2012-12-12 12:34:55
Bài viết http://pivotallabs.com/users/pjaros/blog/articles/1368-javascript-constructors-prototypes-and-the-new-keyword đã giúp tôi hiểu nhiều về cách tạo đối tượng trong Javascript hoạt động. Để ghi đè 'Date.prototype.constructor' không giúp trước khi tạo đối tượng. Sẽ cố gắng viết lại chức năng 'Ngày' và cho bạn biết –
Mã số ' var oDateFnctn = oDateFnctn || Ngày; chức năng Date() { var d = new oDateFnctn (đối số); var ac = arguments.length; var ay = arguments [0]; nếu (((ac == 3) || (ac == 6)) && (ay <100) && (ay> = 0)) { d.setFullYear (ay); } trả lại d; } ' kết quả trong lỗi ** Phạm vi không kích hoạt: Lỗi cuộc gọi tối đa đã vượt quá **. Tôi hiện đang bị kẹt –
Chỉ ** không ghi đè ** các nhà xây dựng gốc với hành vi ** tùy chỉnh **. Không bao giờ. Xây dựng chức năng của riêng bạn cho điều đó. – Bergi