piggybacking na Aadit Zastępca natywnego konstruktora daty Shah - to powinna być odpowiedź, ale nie mam dostatecznego przedstawiciela SO - jak wspomniał @sakthi, utracisz swoje natywne metody Date, robiąc to w ten sposób. Trochę to przynosi, ponieważ metody dat są nieprzeliczalne, więc musisz zaimplementować trochę hack, aby je sklonować.
Po pierwsze, polecam nie robienie tego w ten sposób, chyba że musisz. W moim przypadku pracowałem w aplikacji z pakietem starszego kodu, który konstruował daty za pomocą formatu "m-d-yyyy", który działa w chrome, ale nie safari. Nie mogłem po prostu znaleźć/zastąpić w aplikacji, ponieważ było wiele przypadków, w których ciągi dat były pobierane z warstwy usługi lub bazy danych. Zdecydowałem się więc przesłonić konstruktor Date w przypadku, gdy istnieje argument datownika w formacie "m-d-rrrr". Chciałem, aby było tak małoinwazyjne, jak to tylko możliwe, aby działało jak normalnie.
Oto moje zmiany - powinny pozwolić na zastąpienie daty pewnymi zmianami w konstruktorze, ale wszystko inne to samo. Będziesz chciał zmienić konstruktor MyDate, zanim instancja zostanie wywołana, aby zrobić to, co chcesz, aby konstruktor obsługiwał. Nastąpi to ZANIM zostanie zastosowany konstruktor daty systemowej.
var bind = Function.bind;
var unbind = bind.bind(bind);
function instantiate(constructor, args) {
return new (unbind(constructor, null).apply(null, args));
}
Date = function (Date) {
// copy date methods - this is a pain in the butt because they're mostly nonenumerable
// Get all own props, even nonenumerable ones
var names = Object.getOwnPropertyNames(Date);
// Loop through them
for (var i = 0; i < names.length; i++) {
// Skip props already in the MyDate object
if (names[i] in MyDate) continue;
// Get property description from o
var desc = Object.getOwnPropertyDescriptor(Date, names[i]);
// Use it to create property on MyDate
Object.defineProperty(MyDate, names[i], desc);
}
return MyDate;
function MyDate() {
// we only care about modifying the constructor if a datestring is passed in
if (arguments.length === 1 && typeof (arguments[0]) === 'string') {
// if you're adding other date transformations, add them here
// match dates of format m-d-yyyy and convert them to cross-browser-friendly m/d/yyyy
var mdyyyyDashRegex = /(\d{1,2})-(\d{1,2})-(\d{4})/g;
arguments[0] = arguments[0].replace(mdyyyyDashRegex, function (match, p1, p2, p3) {
return p1 + "/" + p2 + "/" + p3;
});
}
// call the original Date constructor with whatever arguments are passed in here
var date = instantiate(Date, arguments);
return date;
}
}(Date);
referencje:
Artykuł http://pivotallabs.com/users/pjaros/blog/articles/1368-javascript-constructors-prototypes-and-new-keyword pomógł mi zrozumieć, jak działa tworzenie obiektów w Javascript. Przesłonięcie 'Date.prototype.constructor' nie pomaga przed utworzeniem obiektu. Spróbuję ponownie napisać funkcję 'Date' i powiadomić o tym –
Kod ' var oDateFnctn = oDateFnctn || Data; funkcja Date() { var d = new oDateFnctn (argumenty); var ac = arguments.length; var ay = argumenty [0]; if (((ac == 3) || (ac == 6)) && (ay <100) && (ay> = 0)) { d.setFullYear (ay); } return d; } ' wyniki w ** Uncaught RangeError: Przekroczono maksymalny rozmiar stosu połączeń ** błąd. Utknąłem teraz –
Po prostu ** nie zastępuj ** rodzimych konstruktorów ** niestandardowym ** zachowaniem. Nigdy. Zbuduj dla tego swoją własną funkcję. – Bergi