Я сделал больше моего собственного расследования и придумал заключение, что это - невозможный подвиг , из-за того, как класс Даты реализован.
я осмотрел исходный код SpiderMonkey , чтобы видеть, как Дата была реализована. Я думаю, что все это сводится к следующим немногим строкам:
static JSBool
Date(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
jsdouble *date;
JSString *str;
jsdouble d;
/* Date called as function. */
if (!(cx->fp->flags & JSFRAME_CONSTRUCTING)) {
int64 us, ms, us2ms;
jsdouble msec_time;
/* NSPR 2.0 docs say 'We do not support PRMJ_NowMS and PRMJ_NowS',
* so compute ms from PRMJ_Now.
*/
us = PRMJ_Now();
JSLL_UI2L(us2ms, PRMJ_USEC_PER_MSEC);
JSLL_DIV(ms, us, us2ms);
JSLL_L2D(msec_time, ms);
return date_format(cx, msec_time, FORMATSPEC_FULL, rval);
}
/* Date called as constructor. */
// ... (from here on it checks the arg count to decide how to create the date)
, Когда Дата используется в качестве функции (или как Date()
или Date.prototype.constructor()
, которые являются точно тем же самым), оно принимает значение по умолчанию к возврату текущего времени как строка в формате локали. Это независимо от любых аргументов, которые передаются в:
alert(Date()); // Returns "Thu Oct 09 2008 23:15:54 ..."
alert(typeof Date()); // Returns "string"
alert(Date(42)); // Same thing, "Thu Oct 09 2008 23:15:54 ..."
alert(Date(2008, 10, 10)); // Ditto
alert(Date(null)); // Just doesn't care
я не думаю, что существует что-либо, что может быть сделано на уровне JS для хитрости этого. И это - вероятно, конец моего преследования в этой теме.
я также заметил что-то интересное:
/* Set the value of the Date.prototype date to NaN */
proto_date = date_constructor(cx, proto);
if (!proto_date)
return NULL;
*proto_date = *cx->runtime->jsNaN;
Date.prototype
экземпляр Даты с внутренним значением NaN
и поэтому,
alert(Date.prototype); // Always returns "Invalid Date"
// on Firefox, Opera, Safari, Chrome
// but not Internet Explorer
, IE не разочаровывает нас. Это делает вещи немного по-другому и вероятно устанавливает внутреннее значение к -1
так, чтобы Date.prototype всегда возвращал дату немного перед эпохой.
я наконец вырыл в сам ECMA-262, и оказывается, чего я пытаюсь достигнуть (с объектом Даты), - по определению - не возможен:
15.9.2 Конструктор Date, Названный как Функция
, Когда Дату называют как функция, а не как конструктор, она возвращает строку, представляющую текущее время (UTC).
ПРИМЕЧАНИЕ вызов функции
Date(…)
не эквивалентен выражениюnew Date(…)
создания объекта с теми же аргументами.15.9.2.1 Даты ([год [месяц [дата [часы [минуты [секунды [мс]]]]]]])
Все аргументы являются дополнительными; любые предоставленные аргументы приняты, но полностью проигнорированы. Строка создается и возвращается как будто по выражению
(new Date()).toString()
.
В динамическом LINQ используются строковые выражения, позволяющие создавать динамические запросы. Таким образом, мы фактически теряем безопасность типов. В то время как использование шаблонов-оберток, таких как шаблон-декоратор для его тесно связанного воплощения, шаблон спецификации позволяет нам поддерживать безопасность типа в коде. Я исследую использование шаблона декоратора в качестве оболочки запроса для повторного использования и динамического построения запросов. Вы можете найти статью о проекте кода по адресу: Оболочки запросов Linq
Или вы можете проверить мой блог .
Я разработчик C # и люблю использовать шаблон спецификации, потому что он ближе к моей сфере деятельности. Более того, вас не удивит этот шаблон, если класс спецификации существует, он должен работать. С Linq ваш базовый провайдер, возможно, не реализовал некоторые функции, и вы не узнаете об этом до времени выполнения.
Но, безусловно, самое большое преимущество спецификации перед linq - это быть ближе к бизнесу, это мини-DSL. LINQ для меня - это DSL для запроса сбора, а не для бизнес-домена.
На самом деле я не знаю LINQ, но мне кажется, что система декларативных запросов в целом связана с шаблоном спецификации. В частности, реализация системы декларативных запросов путем объединения объектов в объектно-ориентированную среду. IIRC, который сродни тому, что делает LINQ, предоставляя слой синтаксического сахара.
Я не могу сказать, полностью ли LINQ устарел шаблон. Может быть, есть крайние случаи, которые просто невозможно выразить в LINQ?