2012-05-17 7 views
1

Possible Duplicate:
Advantages of using prototype, vs defining methods straight in the constructor?Пользовательские классы - это прототип?

Какова наилучшая практика при создании пользовательских классов и общедоступных методов в JavaScript и, что еще важнее ... почему?

Использование 'this' для создания общедоступных методов?

var myClass = function() { 

    this.myVar = "this is my value"; 

    this.myFunc = function() { 
     alert(this.myVar); 
    }; 

    this.myFunc(); 
}; 

-ИЛИ- Использование «прототипа» для создания общих методов?

var myClass = function() { 

    this.myFunc(); 
}; 

myClass.prototype = { 

    myVar: "this is my value", 

    myFunc: function() { 
     alert(this.myVar); 
    } 

}; 

Большое спасибо !!!

+0

Этот вопрос задают по крайней мере один раз в день ... –

ответ

0

Объявление метода с использованием прототипа означает, что метод доступен экземпляру этого прототипа в любое время, пока этот экземпляр создается после объявления метода.

Объявление его в конструкторе с использованием 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"); 
}; 
+0

Большое спасибо за подробный ответ! – SpaceCowboy2071

Смежные вопросы