Зачем мне ключевое слово `new` для экземпляра` Date` в JavaScript? - PullRequest
13 голосов
/ 27 августа 2010

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

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

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

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!

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

Ответы [ 2 ]

3 голосов
/ 27 августа 2010

Большую часть этого можно сделать самостоятельно. Вызов пустого конструктора без 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;
};

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

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();
0 голосов
/ 27 августа 2010

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

...