2013-07-18 3 views
13

Вопрос:Почему функция 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"); 

ответ

24

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

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

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

Объекта разрешение свойства не имеет ничего общего с размахом. Фраза «Неверный объем» будет лучше, чем «неправильный метод доступа». – RobG

+0

достаточно справедливо. изм. –

+0

спасибо за помощь – flylib

0

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

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

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

+0

спасибо за помощь – flylib

4

В коде:

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

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

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

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

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

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

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

, а затем:

john.greet('Fred'); 

потому Приветствуйте называется методом сортире, он возвращает:

Hi Fred, my name is John 
+0

спасибо за помощь – flylib

1

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

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

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

0

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

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

Person("Joe") 
greet("Kate") 
Смежные вопросы