Давайте сначала разберемся с некоторыми основами прототипа :
Объекты функций наследуются от Function.prototype.Модификации объекта Function.prototype распространяются на все экземпляры Function.
Если вы привыкли к объектно-ориентированному языку программирования, вы можете думать о prototype
как об определении класса комбинации / staticнабор переменных.Конечно, любая аналогия, которую вы выберете, будет неудачной, так как она не эквивалентна любому из них.
Когда вы определяете любую функцию в JavaScript, у вас есть потенциал для созданияэкземпляр функции (аналогично object
в ООП).
Рассмотрим следующий пример:
function example(some, params)
{
var foo = some;
this.bar = params;
//more code...
}
Если он был вызван в контексте окна:
window.example('fizz', 'buzz');
вы бы знали, что foo
была временной переменной, хранящей значение 'fizz'
на время вызова функции, и что для window.bar
будет установлено значение 'buzz'
.
Однако, если бы он использовался для создания нового объекта
var temp = new example('fizz', 'buzz');
, вы бы знали, что foo
по-прежнему была временной переменной, хранящей значение 'fizz'
на протяжениивызов функции, и теперь temp.bar
будет установлен в значение 'buzz'
.
Если бы мы должны были определить новое свойство в прототипе:
example.prototype.baz = 'w00t';
Каждый экземпляр функции example
теперь будет иметь свойство baz
со значением* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * [10} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1.} * * * * * * * * * * * * * * * * * *.для них определена функция.
Что происходит, когда вы хотите переопределить значение прототипа?
Если вы переопределите свойство в prototype
, все экземпляры будут обновлены:
example.prototype.baz = 'new w00t';
Однако, если вы переопределите свойство в экземпляре, будет обновлен только этот экземпляр :
temp.baz = 'not w00t';
Ваш пример:
Вы хотите circle
объект, имеющий радиус:
function circle(r)
{
//probably should do some value checking stuff here
this.radius = r;
}
Каждый circle
объект имеет окружность:
circle.prototype.getCircumference()
{
return Math.PI * 2 * this.radius;
}
Теперь, если вы создаете новый круг, вы можетеполучить длину окружности:
var c = new circle(5);
console.log(c.getCircumference());
Краткое примечание:
Определение функции для прототипа позволяет всем экземплярам совместно использовать ссылку на одну и ту же функцию.
Есливы создаете функцию для каждого экземпляра:
function temp()
{
this.func = function(){...};
}
Скорее всего, производительность будет хуже, чем уразрешить экземплярам использовать функцию-прототип:
function temp(){}
temp.func = function(){...};