Объявление метода с использованием прототипа означает, что метод доступен экземпляру этого прототипа в любое время, пока этот экземпляр создается после объявления метода.
Объявление его в конструкторе с использованием this.foo = function(){ ... }
означает, что метод будет доступен только после точки в конструкторе, где он объявлен.
В качестве простого примера рассмотрим именованные и анонимные функции.
В дальнейшем мы объявляем именованную функцию и вызываем ее дважды. Обратите внимание на то, что функция выполняет отлично от первого звонка, даже если первый вызов перед объявлением функции:
foo();
function foo()
{
alert("foo");
}
foo();
теперь вместо имени функции мы будем использовать анонимную функцию, хранящуюся в переменной: Примечание теперь, когда первый вызов вызывает ошибку, потому что foo
не определено в этот момент.
foo();
var foo = function()
{
alert("foo");
}
foo();
Прототипы работать в (концептуально) аналогичным образом, когда мы изменяем прототип функции, мы воздействующих на него до того, как экземпляр этой функции создается. Таким образом, следующие прекрасно работает:
function f()
{
this.bar();
}
f.prototype.bar = function()
{
alert("bar");
};
var f1 = new f();
Обратите внимание, что f.prototype.bar
физически объявлен после того, как линии, где мы называем его. Теперь сравните это с методом this. ...
. Следующие работы, как ожидается,
function g()
{
this.h = function(){
alert("h");
};
this.h();
}
var g1 = new g();
в то время как это не потому, что мы пытаемся назвать this.h
, прежде чем мы назначили ему значение:
function g()
{
this.h();
this.h = function(){
alert("h");
};
}
var g2 = new g();
Обратите внимание, однако, что влияет на прототип функции по-прежнему использует механизм назначения анонимных функций свойствам прототипа. Это означает, что даже при использовании метода прототипа мы можем получить ошибки, если мы создадим экземпляр прототипа, прежде чем мы добавим функцию в прототип. Например, следующие прекрасно работает:
function f()
{
this.bar();
}
f.prototype.bar = function()
{
alert("bar");
};
var f1 = new f();
но если мы перемещаем var f1 = new f();
над заданием на f.prototype.bar
мы получаем ошибку:
function f()
{
this.bar();
}
var f1 = new f();
f.prototype.bar = function()
{
alert("bar");
};
Этот вопрос задают по крайней мере один раз в день ... –