Я понимаю разницу в поведении . 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!
Я знаю очень специфический запрос. Я надеюсь, что это хорошо. :)
Большую часть этого можно сделать самостоятельно. Вызов простого конструктора без 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();
new
— ключевое слово в Javascript (и других) для создания нового экземпляра объекта.
Возможно дубликат Что такое «новое» ключевое слово в JavaScript?.
См. также эту статью: http://trephine.org/t/index.php?title=Understanding_the_JavaScript_new_keyword