Подтвердить что ты не робот

Какова цель прототипа?

Возможный дубликат:
Понимание прототипного наследования в JavaScript

ОК, Итак, я несколько новичок в идее ООП в JS.

В чем разница между этими двумя фрагментами кода, написанными ниже:

function animal(){
    this.name = 'rover';
    this.set_name = function(name){
         this.name = name;
    }
}
function animal(){
    this.name = 'rover';
}
animal.prototype.set_name = function(name){
    this.name = name;
}

Они оба делают одно и то же, так в чем разница?

4b9b3361

Ответ 1

Использование прототипа позволяет быстрее создавать объекты, поскольку эту функцию не нужно создавать заново при создании нового объекта.

Когда вы это сделаете:

function animal(){
    this.name = 'rover';
    this.set_name = function(name){
         this.name = name;
    }
}

Функция set_name создается de novo каждый раз при создании животного. Но когда вы это сделаете,

animal.prototype.set_name = function(name){
    this.name = name;
}

Функция не должна повторно создаваться каждый раз; он существует в одном месте в прототипе. Поэтому, когда вы вызываете someAnimal.set_name("Ubu");, в контекст this будет установлен someAnimal и (функция one и only) set_name.


Существует одно преимущество использования первого синтаксиса: функции, созданные таким образом, будут иметь доступ к личным данным:

function animal(){
    var privateData = 'foo'

    this.name = 'rover';
    this.set_name = function(name){
         this.name = name;
         alert(privateData); //will alert 'foo'
    }
}

Дуглас Крокфорд называет функции, созданные таким образом "привилегированные" по этой причине: у них есть доступ к публичным и частным данным.

Ответ 2

Разница возникает при создании нового объекта из этой функции

var animal1 = new animal();

Все объекты, созданные первой функцией, будут иметь разные свойства name и set_name. Однако все объекты, созданные второй функцией, будут обладать свойством set_name.

Ответ 3

В первом примере каждое отдельное животное имеет собственное свойство для функции set_name, а во втором примере они используют одну и ту же функцию через свой прототип.

Преимущество первой версии заключается в том, что методы могут обращаться к локальным (закрытым) переменным, объявленным внутри конструктора.

Преимущество второго метода заключается в том, что ему требуется меньше памяти (поскольку вы только храните метод один раз, а не миллион раз) и более эффективны в современных JS-машинах.

Используя второй метод, вы также можете модифицировать или добавлять методы в класс таким образом, который также влияет на экземпляры, которые уже были созданы.