2013-07-18 23 views
13

Frage:Warum gibt die Greet-Funktion nicht den erwarteten Wert zurück?

Warum gibt die Greet-Funktion nicht den erwarteten Wert zurück?

Code:

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

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

Wie kann ich das beantworten? Ich erschaffe eine neue Person, was mache ich dann?

var John = new Person("John"); 

Antwort

24

Falsche Zugriffsmethode. Die Variable name ist nicht definiert, nur this.name ist definiert. Es sucht also nach einer Variablen im Funktionsumfang namens name anstelle einer Eigenschaft des Objekts name.

Um auf die Objekteigenschaft innerhalb des Objekts zuzugreifen, verwenden wir das Schlüsselwort this. Daher müssen wir this.name verwenden, um auf die Eigenschaft name in der folgenden Implementierung zuzugreifen.

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

Objekteigenschaft Auflösung nichts mit Rahmen zu tun hat. Der Ausdruck "falscher Umfang" wäre besser als "falsche Zugriffsmethode". – RobG

+0

fair genug. bearbeitet. –

+0

danke für die hilfe – flylib

0

Sie müssen die greet Funktion ändern den Namen des Objekts zu verwenden, mit dem this Stichwort:

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

danach, rufen Sie einfach John.greet("other name");

+0

danke für die hilfe – flylib

4

In Ihrem Code:

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

Wenn Sie als Konstruktor aufgerufen werden, wird oben eine benannte Eigenschaft von a erstellt N Instanz Name und weisen Sie ihm den Wert der Name Parameter.

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

Hier der Kennung Name wird als Variable verwendet, aber die Kennung die Sie suchen, ist eine benannte Eigenschaft der Instanz, so dass Sie es auf als solche zugreifen müssen. In der Regel wird diese Funktion als Methode der Instanz aufgerufen, so dass diese innerhalb der Funktion eine Referenz auf die Instanz ist.Sie wollen also:

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

So, jetzt, wenn Sie tun können (beachten Sie, dass Variablen mit einem Großbuchstaben beginnen, sind per Konvention reserviert für construtors):

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

und dann:

john.greet('Fred'); 

weil greet als Methode der John genannt wird, wird es zurück:

Hi Fred, my name is John 
+0

danke für die hilfe – flylib

1

Alternativ kann, da dies eine Frage der Umfang Vererbung (zweite Funktion keinen Zugriff auf die Variable „name“ haben), können wir den Code zu sehen wie folgt neu formulieren sie alle unter der Person Funktion ein:

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

Funktioniert auch.

0

Versuchen Sie Folgendes:

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

Person("Joe") 
greet("Kate") 
Verwandte Themen