Инстанцирование JavaScript возражает путем вызова prototype.constructor.apply

Метод WORKING {если нет проблем, кроме конфигурации}

По умолчанию Appache не ограничивает доступ из ipv4. (общий внешний ip)

Что может быть ограничено конфигурациями в «httpd.conf» (или «apache2.conf» в зависимости от вашей конфигурации apache)

Решение:

Заменить все:

<Directory />
     AllowOverride none
    Require all denied

</Directory>

с

<Directory />
     AllowOverride none
#    Require all denied

</Directory>

, поэтому удалив все ограничения, предоставленные Apache

Замените Require local на Require all granted в каталоге C:/wamp/www/

<Directory "c:/wamp/www/">
    Options Indexes FollowSymLinks
    AllowOverride all
    Require all granted
#   Require local
</Directory>
54
задан 7 revs 19 October 2008 в 21:59
поделиться

7 ответов

Я сделал больше моего собственного расследования и придумал заключение, что это - невозможный подвиг , из-за того, как класс Даты реализован.

я осмотрел исходный код 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().

64
ответ дан Ates Goral 7 November 2019 в 18:02
поделиться

Это менее элегантно, но вот решение:

function GeneratedConstructor (methodName, argumentCount) {
    var params = []

    for (var i = 0; i < argumentCount; i++) {
        params.push("arguments[" + i + "]")
    }

    var code = "return new " + methodName + "(" + params.join(",") +  ")"

    var ctor = new Function(code)

    this.createObject = function (params) {
        return ctor.apply(this, params)
    }
}

То, как это работает, должно быть довольно очевидным. Это создает функцию посредством генерации кода. В этом примере есть фиксированное количество параметров для каждого создаваемого вами конструктора, но в любом случае это полезно. В большинстве случаев вы имеете в виду максимальное количество аргументов. Это также лучше, чем некоторые другие примеры здесь, потому что это позволяет вам сгенерировать код один раз, а затем повторно использовать его. Сгенерированный код использует преимущества функции переменных аргументов в javascript, так что вы можете избежать именования каждого параметра (или прописать их в списке и передать аргументы генерируемой вами функции). Вот рабочий пример:

var dateConstructor = new GeneratedConstructor("Date", 3)
dateConstructor.createObject( [ 1982, 03, 23 ] )

Это вернет следующее:

Пт 23 апреля 1982 00:00: 00 GMT-0800 (PST)

Это действительно все еще ... немного уродливо. Но это по крайней мере удобно скрывает беспорядок и не предполагает, что сам скомпилированный код может собирать мусор (так как это может зависеть от реализации и является вероятной областью для ошибок).

Приветствия, Скотт С. Маккой

4
ответ дан 7 November 2019 в 08:02
поделиться

Я бы не назвал это элегантным, но в моем тестировании (FF3, Saf4, IE8) он работает:

var arr = [2009, 6, 22, 10, 30, 9 ];

Вместо этого:

var d = new Date (arr [0], arr [1], arr [2], arr [3], arr [4], arr [5]);

Попробуйте следующее:

var d = new Date (Date.UTC.apply (window, arr) + ((new Date ()). GetTimezoneOffset () * 60000));

14
ответ дан 7 November 2019 в 08:02
поделиться

Вы можете сделать это с вопиющим, вопиющим злоупотреблением eval:

var newwrapper = function (constr, args) {
  var argHolder = {"c": constr};
  for (var i=0; i < args.length; i++) {
    argHolder["$" + i] = args[i];
  }

  var newStr = "new (argHolder['c'])(";
  for (var i=0; i < args.length; i++) {
    newStr += "argHolder['$" + i + "']";
    if (i != args.length - 1) newStr += ", ";
  }
  newStr += ");";

  return eval(newStr);
}

пример использования:

function Point(x,y) {
    this.x = x;
    this.y = y;
}
var p = __new(Point, [10, 20]);
alert(p.x); //10
alert(p instanceof Point); //true

Enjoy =).

0
ответ дан 7 November 2019 в 08:02
поделиться

Это - то, как Вы могли бы решить определенный case:-

function writeLn(s)
{
    //your code to write a line to stdout
    WScript.Echo(s)
}

var a =  [ 2008, 10, 8, 00, 16, 34, 254 ]

var d = NewDate.apply(null, a)

function NewDate(year, month, date, hour, minute, second, millisecond)
{
    return new Date(year, month, date, hour, minute, second, millisecond);
}

writeLn(d)

Однако, Вы ищете более общее решение. Рекомендуемый код для создания метода конструктора должен иметь его return this.

Hence:-

function Target(x , y) { this.x = x, this.y = y; return this; }

мог быть созданным:-

var x = Target.apply({}, [1, 2]);

Однако не, все реализации прокладывают себе путь не в последнюю очередь, потому что цепочка прототипа была бы wrong:-

var n = {};
Target.prototype = n;
var x = Target.apply({}, [1, 2]);
var b = n.isPrototypeOf(x); // returns false
var y = new Target(3, 4);
b = n.isPrototypeOf(y); // returns true
8
ответ дан AnthonyWJones 7 November 2019 в 18:02
поделиться
var comps = [ 2008, 10, 8, 00, 16, 34, 254 ];
var d = eval("new Date(" + comps.join(",") + ");");
-3
ответ дан harley.333 7 November 2019 в 18:02
поделиться

Отредактированный

Извините, я был уверен, что сделал его тем путем несколько лет назад, прямо сейчас я буду придерживаться:

var d = новая Дата (аккомпанементы [0], аккомпанементы [1], аккомпанементы [2], аккомпанируют [3], аккомпанируют [4], аккомпанируют [5], аккомпанируют [6]);

Редактирование:

, Но действительно помнят, что объект Даты JavaScript использует индексы в течение многих месяцев, таким образом, вышеупомянутый массив означает

8 ноября 2008 00:16:34:254

-2
ответ дан roenving 7 November 2019 в 18:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: