Функция прототипа JavaScript не перекрывает оригинальную - PullRequest
7 голосов
/ 15 апреля 2009

Изучение JavaScript, когда я наткнулся на концепцию прототипа. Мне удалось добавить новые методы в класс cat , но не удалось переопределить оригинальный метод talk .

function cat(name) {
    this.name = name;
    this.talk = function() {
        alert( this.name + " : I'm a girl!" )
    }
}

cat.prototype.talk = function() {
    alert( this.name + " : I'm a dude!" )
}

cat1 = new cat("felix")
cat1.talk()

Почему это не предупреждает новый текст?

Ответы [ 2 ]

16 голосов
/ 15 апреля 2009

‘function cat’ - это просто функция. Его прототипом является пустой объект ({}). «Новый кот» может быть вызван для добавления членов «имя» и «говорить» к новому объекту. Под этим новым объектом будет прототип функции, который все еще {}.

var c= new cat('Tiddles');

c ownProperties: { 'name': 'Tiddles', 'talk': function() {...} }
c inherited: {}

Теперь, когда вы пишете в «cat.prototype.talk», вы добавляете членов к этому базовому объекту:

c ownProperties: { 'name': 'Tiddles', 'talk': function() {...} }
c inherited: { 'talk': function() {...} }

Функция «talk», установленная непосредственно в экземпляре «c», имеет приоритет над «talk», косвенно установленной в прототипе конструктора c.

Итак, вы смешали здесь два стиля наследования: метод присвоения this и метод prototype.

Запись методов в прототипы имеет то преимущество, что вы не получаете избыточных копий одних и тех же членов, скопированных в каждый экземпляр объекта; Преимущество записи в экземпляры состоит в том, что она решает проблему связанных методов. Какой из них вы выбираете, зависит от вас, но не смешивайте два. Если вы хотите пойти по прототипу, в «this» должно быть записано только «name», потому что это единственное свойство, характерное для каждого экземпляра.

7 голосов
/ 15 апреля 2009

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

члены на уровне объекта переопределяют элементы на уровне прототипа.

...