В JS функция - это Объект. Требуется время, чтобы привыкнуть к этому, но это правда. Бросьте это немного, и код, который вы видите, использует другие, будет иметь больше смысла. Если вы видели Javascript, где люди передают функцию () {} в качестве параметра другой функции, это доказывает, что функции являются объектами первого класса.
Как только вы сможете обернуть это вокруг (это заняло у меня некоторое время), вам нужно понять, что если вы создадите функцию, вы можете получить ее Новый экземпляр. Смотрите следующий код:
function FooName(){
var name;
this.setName = function(n){
this.name = n;
}
this.getName = function(){
return this.name;
}
}
var n1 = new FooName();
var n2 = new FooName();
n1.setName("FOO");
n2.setName("BAR");
На данный момент у вас есть два экземпляра метода FooName: n1 и n2. В JS принято заключать, что ваша инстанцируемая функция называет первую букву в верхнем регистре вместо первой буквы в нижнем регистре. В этом примере я указываю, что моя функция может быть запущена, называя ее FooName вместо fooName. Я надеюсь это имеет смысл.
В приведенном выше примере n1 имеет три свойства. Частное свойство name, открытое свойство setName и открытое свойство getName. Каждый раз, когда я создаю экземпляр нового FooName, будут создаваться копии getName и setName. Это может тратить пространство в памяти. Поскольку getName и setName не собираются меняться, мне не нужна новая копия для каждого экземпляра FooName. Здесь и появляются прототипы.
Вы можете сказать следующее, и тогда getName и setName будут существовать только один раз в памяти, освобождая память, что хорошо.
FooName.prototype.setName = function(n){
this.name = n;
}
FooName.prototype.getName = function(){
return this.name;
}
Если вы удалите getName и setName из функции FooName, то теперь у вас будет «класс» FooName, имеющий два метода, getName и setName.
Поиграй с этим. Дайте мне знать, если у вас есть вопросы.