2013-07-18 29 views
13

Pytanie:Dlaczego funkcja greet nie zwraca oczekiwanej wartości?

Dlaczego funkcja powitania nie zwraca oczekiwanej wartości?

Kod:

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

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

Jak mogę odpowiedzieć na to pytanie? Tworzę nową osobę, a potem co mam robić?

var John = new Person("John"); 

Odpowiedz

24

Metoda niewłaściwego dostępu. zmienna name nie jest zdefiniowana, zdefiniowano tylko this.name. Dlatego szuka zmiennej w zakresie funkcji o nazwie name zamiast właściwości obiektu o nazwie name.

Aby uzyskać dostęp do właściwości obiektu z obiektu, używamy słowa kluczowego this. W związku z tym będziemy musieli użyć this.name, aby uzyskać dostęp do właściwości name w poniższej implementacji.

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

Obiekt ma nic wspólnego z zakresem. Fraza "Wrong scope" byłaby lepsza jako "metoda błędnego dostępu". – RobG

+0

wystarczająco fair. edytowane. –

+0

dzięki za pomoc – flylib

0

Trzeba zmienić funkcję powitalną używać nazwy obiektu z this słów kluczowych:

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

potem, po prostu zadzwoń John.greet("other name");

+0

dzięki za pomoc – flylib

4

W kodzie:

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

Po wywołaniu jako konstruktor powyższe utworzy nazwaną właściwość n wystąpienie o nazwie nazwa i przypisz mu wartość parametru o nazwie.

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

Tutaj nazwą identyfikator służy jako zmienna, ale identyfikator szukasz to nazwana właściwością instancji, więc trzeba do niego dostęp w jako takim. Zazwyczaj funkcja ta będzie wywoływana jako metoda instancji, więc w ramach funkcji będzie odwołanie do instancji.Więc chcesz:

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

więc teraz, kiedy można zrobić (należy pamiętać, że zmienne rozpoczynające się od litery są zwyczajowo zarezerwowane dla construtors):

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

a następnie:

john.greet('Fred'); 

ponieważ pozdrawiam nazywany jest jako metoda Jana, zwróci:

Hi Fred, my name is John 
+0

dzięki za pomoc – flylib

1

Alternatywnie, ponieważ jest to problem z zakresu dziedziczenia (druga funkcja nie mając dostępu do zmiennej „name”), możemy przeformułować kod wyglądać tak, aby obejmować wszystko pod funkcją osobę:

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

Działa również.

0

Spróbuj wykonać następujące czynności: rozdzielczość nieruchomość

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

Person("Joe") 
greet("Kate") 
Powiązane problemy