Почему функция 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");
Ответы
Ответ 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")