Почему функция greet не возвращает ожидаемое значение? - программирование

Почему функция greet не возвращает ожидаемое значение?

Вопрос:

Почему функция greet не возвращает ожидаемое значение?

код:

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

Person.prototype.greet = function(otherName){
     return "Hi" + otherName + ", my name is " + name;
}

Как я могу ответить на это? Я создаю нового человека, тогда что мне делать?

var John = new Person("John");
4b9b3361

Ответ 1

Неверный метод доступа. переменная name не определена, определяется только this.name. Поэтому он ищет переменную в области функций под названием name вместо свойства объекта с именем name.

Чтобы получить доступ к объекту из объекта, мы используем ключевое слово this. Таким образом, нам нужно использовать this.name для доступа к свойству name в реализации ниже.

Person.prototype.greet = function(otherName){
     return "Hi" + otherName + ", my name is " + this.name;
}

Ответ 2

В вашем коде:

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

Когда вызывается как конструктор, вышесказанное создаст именованное свойство экземпляра с именем name и присвоит ему значение параметра name.

> Person.prototype.greet = function(otherName){
>     return "Hi" + otherName + ", my name is " + name;
> }

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

      return "Hi" + otherName + ", my name is " + this.name;

Итак, теперь, когда вы можете это сделать (обратите внимание, что переменные, начинающиеся с заглавной буквы, по соглашению зарезервированы для подрядчиков):

> var john = new Person("John");

а затем:

john.greet('Fred');

потому что greet вызывается как метод john, он возвращает:

Hi Fred, my name is John

Ответ 3

В качестве альтернативы, поскольку это проблема наследования области (вторая функция не имеет доступа к переменной "name" ), мы можем перефразировать код, чтобы он выглядел так, чтобы включить его под функцию Person:

function Person(name){
   this.name = name;
   this.greet = function(otherName){
      return "Hi" + otherName + ", my name is " + name;
    }
}

Работает также.

Ответ 4

Вам нужно изменить функцию приветствия, чтобы использовать имя объекта с ключевым словом this:

Person.prototype.greet = function(otherName){
     return "Hi" + otherName + ", my name is " + this.name;
}

после этого просто вызовите John.greet("other name");

Ответ 5

Попробуйте следующее:

function Person(name){
   this.name = name;
   this.greet = function(otherName){
      return "Hi " + otherName + ", my name is " + name;
    }
} 

Person("Joe")
greet("Kate")