Почему мне нужно ключевое слово `new` для экземпляра` Date` в JavaScript?

Я понимаю разницу в поведении . Date () возвращает строку, представляющую текущую дату, а new Date () возвращает экземпляр объекта Date, методы которого я могу вызвать.

Но я не знаю почему . JavaScript является прототипом, поэтому Date - это функция и объект, который имеет функции-члены (методы), которые также являются объектами. Но я не писал и не читал никакой JavaScript, который ведет себя таким образом, и я хотел бы понять разницу.

Может кто-нибудь показать мне пример кода функции, у которой есть метод, возвращает экземпляр с оператором new и выводит строку при вызове напрямую? то есть, как что-то подобное происходит?

Date();                   // returns "Fri Aug 27 2010 12:45:39 GMT-0700 (PDT)"
new Date();               // returns Object
new Date().getFullYear(); // returns 2010
Date().getFullYear();     // throws exception!

Я знаю очень специфический запрос. Я надеюсь, что это хорошо. :)

13
задан Justin Force 27 August 2010 в 19:48
поделиться

2 ответа

Большую часть этого можно сделать самостоятельно. Вызов простого конструктора без new и получение строки является специальным для Date согласно спецификации ECMA, но вы можете смоделировать что-то подобное для этого.

Вот как это сделать. Сначала объявите объект в шаблоне конструктора (например, функцию, которая предназначена для вызова с new и которая возвращает ссылку this:

var Thing = function() {
    // Check whether the scope is global (browser). If not, we're probably (?) being
    // called with "new". This is fragile, as we could be forcibly invoked with a 
    // scope that's neither via call/apply. "Date" object is special per ECMA script,
    // and this "dual" behavior is nonstandard now in JS. 
    if (this === window) { 
        return "Thing string";
    }

    // Add an instance method.
    this.instanceMethod = function() {
        alert("instance method called");
    }

    return this;
};

Новые экземпляры Thing могут иметь ]instanceMethod(). Теперь просто добавьте «статическую» функцию к самой вещи:

Thing.staticMethod = function() {
    alert("static method called");
};

Теперь вы можете сделать это:

var t = new Thing(); 
t.instanceMethod();
// or...
new Thing().instanceMethod();
// and also this other one..
Thing.staticMethod();
// or just call it plain for the string:   
Thing();
3
ответ дан 2 December 2019 в 02:23
поделиться

new — ключевое слово в Javascript (и других) для создания нового экземпляра объекта.
Возможно дубликат Что такое «новое» ключевое слово в JavaScript?.
См. также эту статью: http://trephine.org/t/index.php?title=Understanding_the_JavaScript_new_keyword

-1
ответ дан 2 December 2019 в 02:23
поделиться
Другие вопросы по тегам:

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