Почему функция, которая является свойством объекта, недоступна, когда мы добавляем ту же функцию в его прототип? - PullRequest
0 голосов
/ 11 мая 2018

У меня есть некоторое общее представление о том, почему мы используем прототипное наследование, делая некоторые вещи в моем приложении, я понял, что вы не сможете получить доступ к функции, если добавите функцию с тем же именем в ее прототип.Почему это так, вот мой код:

function person(firstname, lastname) {
    this.firstname = firstname,
    this.lastname = lastname,
    this.greet = function() {
        console.log('hey there', this.lastname + '  ' + this.firstname);
    }
}

var jane = new person('jane', 'Doe');
jane.greet();
var john = new person('john', 'smith');
john.greet();

function person(firstname, lastname) {
    this.firstname = firstname,
    this.lastname = lastname
}

person.prototype.greet = function() {
    console.log('hey there', this.lastname + '  ' + this.firstname);
}

var jane = new person('jane', 'Doe');
jane.greet();
var john = new person('john', 'smith');
john.greet();

Выдается ошибка:

"test.js:10
jane.greet();
     ^
TypeError: jane.greet is not a function"

1 Ответ

0 голосов
/ 11 мая 2018

У меня работает. Единственная проблема, о которой я мог подумать, это то, что вы повторно объявили (или попытались повторно объявить) один и тот же метод person в том же блоке кода.

Редактировать для пояснения: Как указано ASDFGerte, второе объявление person перезаписывает первую версию, удаляя внутренний метод greet. Затем вы пытаетесь использовать greet до того, как prototype развернет person и снова добавит функцию greet.

function person(firstname, lastname) {
    this.firstname = firstname,
    this.lastname = lastname,
    this.greet = function() {
        console.log('hey there', this.lastname + '  ' + this.firstname);
    }
}
var jane = new person('jane', 'Doe');
jane.greet();
var john = new person('john', 'smith');
john.greet();

function person2(firstname, lastname) {
    this.firstname = firstname,
    this.lastname = lastname
}
person2.prototype.greet = function() {
    console.log('(2) hey there', this.lastname + '  ' + this.firstname);
}
var jane2 = new person2('jane2', 'Doe');
jane2.greet();
var john2 = new person2('john2', 'smith');
john2.greet();
...