Зачем использовать прототип для методов вместо this.methodName

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

Зачем использовать:

Person.prototype.toString = function() { return this.name; }

над

Function Person(name) { 
    this.name = name;
    this.toString = function() { 
        return this.name;
    } 
}

person Voriki    schedule 22.09.2011    source источник
comment
Также это - stackoverflow.com/ вопросы/310870/   -  person Richard Dalton    schedule 22.09.2011


Ответы (3)


Ну, вы должны использовать прототипы из-за повторного использования кода и наследования.
По сути, если вы привязываете метод к ключевому слову this, вы предоставляете этот метод только этому конкретному экземпляру, а с прототипом вы пишете метод для всех экземпляров. этого класса.
пример:

function Person(name) {
    this.name = name;
    this.toString = function() {
        return this.name;
    }
}
var bob = new Person('Bob');
var jim = new Person('Jim');
jim.toString = function() {
    return "I have amnesia, I forgot my name!";
};

Теперь, хотя bob и jim являются личностями (экземплярами одного и того же класса), они ведут себя по-разному, потому что у них есть собственный набор правил (методов), на которые они полагаются.
Если бы вы использовали прототип:

function Person(name) {
   this.setName(name);
}
Person.prototype = {
    name : 'default name',
    setName : function(name) {
        this.name = name;
    },
    toString : function() {
       return this.name;
    }
};
var bob = new Person('Bob');
var jim = new Person('Jim');
Person.prototype.toString = function() {
    return "I have amnesia, I forgot my name!";
};

Теперь все ваши люди ведут себя одинаково.
Использование прототипного наследования полезно для повторного использования кода и не загружает память ненужными повторяющимися элементами. + Обновление классов таким образом намного проще.

person gion_13    schedule 22.09.2011

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

function Person(name) { 
    this.name = name;
}

var person = new Person("Test");
alert(person.toString()); // alerts [object Object]

Person.prototype.toString = function() {
    return this.name;
};
alert(person.toString()); // alerts Test

http://jsfiddle.net/28puy/

person Richard Dalton    schedule 22.09.2011

В javascript методы являются объектами. Во втором конструкторе Person вы создаете новый экземпляр функции toString для каждого экземпляра Person. При использовании объекта-прототипа существует только один экземпляр функции toString, который будет общим для всех экземпляров Person.

person cbare    schedule 22.09.2011