2017-05-04 1 views
0

Ich habe folgende Javascript-Schnipsel: `Javascript - getPrototypeOf gibt nicht die Mutter Prototyp

 var alien = { 
      kind: "alien" 
     }; 

     var person = { 
      kind: "human" 
     }; 

     var zack = Object.create(person); 

     alert(Object.getPrototypeOf(zack)); 

    </script> 

`

nicht sicher, warum es zack Prototyp zeigen, statt Person ist Gegenstand. Dank enter image description here

Antwort

1

seine auch person .Aber Person ist ein object.its nicht mit alert() angezeigt werden versuchen, mit console.log() Wenn Sie mit in alert Verwendung zeigen müssen mit JSON.stringify()

How can I view an object with an alert()

var alien = { 
 
    kind: "alien" 
 
}; 
 

 
var person = { 
 
    kind: "human" 
 
}; 
 

 
var zack = Object.create(person); 
 

 
console.log(Object.getPrototypeOf(zack)); 
 

 
alert(JSON.stringify(Object.getPrototypeOf(zack)))

+0

Dank @prasad. Hab es jetzt verstanden. – hdang

1

Probieren Sie es aus. Ich habe Ihren Code ein wenig aufgeräumt und die Standardnamenskonventionen von Klassen verwendet, die mit einem Großbuchstaben beginnen. Protokolle werden auch über die Konsole protokolliert.

// Define the Alien class, always start with an uppercase 
 
var Alien = function() { 
 

 
}; 
 

 
// Setup it's prototype 
 
Alien.prototype = { 
 
    kind: 'alien', 
 
    grab: function() { 
 
    return 'grabby grab'; 
 
    } 
 
} 
 

 
// Define a Person class 
 
var Person = function() { 
 
    this.kind = "human"; 
 
}; 
 

 
// Copy Alien prototype to Person 
 
Person.prototype = Object.create(Alien.prototype); 
 

 
// Create a new instance of of Person 
 
var zack = new Person(); 
 

 
// See what's inside 
 
console.log('Prototype function call: ' + zack.grab()); 
 
console.log('Zack is a: ' + zack.kind); 
 
console.log('Zack is secretly a: ' + Object.getPrototypeOf(zack).kind); 
 

 
console.log(Object.getPrototypeOf(zack));

0

Der Screenshot zeigt den Text von der Object.prototype.toString Methode zurückgegeben. Die Methode wird automatisch aufgerufen, wenn ein Objekt, gebaut von Object, in Text umgewandelt werden muss:

console.log({} + ""); // automatic convertion 
 
console.log({}.toString()); // explicit convertion

Was es ist nicht sagen ist, dass der Prototyp zack Objekt ist. Wenn Sie weitere Informationen zu einem Objekt benötigen, können Sie JSON.stringify verwenden, um eine String-Liste aller nicht funktionswertigen Eigenschaften und ihrer Werte zu erstellen. (JSON.stringify ignoriert Funktion bewertet Eigenschaften von Entwurf.)

Sie auch Gleichheitsoperatoren verwenden könnte zu testen, ob ein Objekt wie der andere ist, zB:

var alien = { 
 
    kind: "alien" 
 
}; 
 
var person = { 
 
    kind: "human" 
 
}; 
 
var zack = Object.create(person); 
 

 
console.log("zack is prototyped on person: " 
 
    + (Object.getPrototypeOf(zack) === person) 
 
);

1

Der Grund, warum Sie sehen [object Object] liegt daran, dass das Objekt bei der Warnung Object.getPrototypeOf(zack) in eine Zeichenfolge konvertiert werden muss, um in der Warnung angezeigt zu werden. Jetzt wird standardmäßig die Methode toString() Object.prototype.toString aufgerufen, die die Zeichenfolgendarstellung eines Objekts zurückgibt. Wenn Sie wirklich einen aussagekräftigen Text in der Warnung anzeigen möchten, müssen Sie die Methode toString für das Objekt person selbst implementieren. Dadurch würde Ihr eigener Text in der Funktion toString() implementiert werden. Der Grund, warum dies passieren würde, ist die Art und Weise, wie Funktionssuche in Javascript geschieht. Zuerst wird das Objekt betrachtet, dann der Prototyp und dann weiter die Prototypkette. Da in diesem Fall die Suche auf der Objektebene selbst gelingen würde, wird die Object.prototype.toString Funktion nicht aufgerufen und Sie würden Ihren eigenen Text in der alert Box sehen.

var alien = { 
 
    kind: "alien" 
 
}; 
 

 
var person = { 
 
    kind: "human" 
 
}; 
 
person.toString = function() { 
 
\t return "I am '"+this.kind+"' kind of object"; 
 
} 
 

 
var zack = Object.create(person); 
 

 
alert(Object.getPrototypeOf(zack));