Wie InvernoMuto darauf hinweist, gibt Object.hasOwnProperty("fullName")
false
zurück, weil es nicht person
eigene Eigenschaft ist; es wird über die Prototypkette vererbt. Wenn Sie this.fullName = "...";
in Ihrem Konstruktor verwenden, rufen Sie den geerbten Setter auf und fügen keine neue Eigenschaft hinzu.
Wenn Sie solche Eigenschaften finden möchten, können Sie:
for..in
Schleife:
new
nicht verwenden, sondern einfach die Funktion:
hasOwnProperty überprüft nicht die Prototypkette des Objekts, in Ihrem Fall werden die Personen get
und set
über die Prototypkette
Jedes von Object abstammende Objekt erbt die hasOwnProperty-Methode. Mit dieser Methode kann festgestellt werden, ob ein Objekt das Objekt hat angegebene Eigenschaft als direkte Eigenschaft dieses Objekts; im Gegensatz zu den Operator überprüft diese Methode den Prototyp des Objekts nicht Kette.
Zitieren @JLRishe
Wenn Sie this.fullName="..." verwenden; in deinem Konstruktor bist du den geerbten Setter aufrufen, keine neue Eigenschaft hinzufügen.
Wenn Sie solche Eigenschaften finden wollen, können Sie einfach eine for ... in-Anweisung verwenden:
%Vor% Laut MDN "Die get-Syntax bindet eine Objekteigenschaft zu einer Funktion, die aufgerufen wird, wenn diese Eigenschaft nachgeschlagen wird. " Das heißt, wenn Sie versuchen, auf fullName
einer Instanz von Name
(z. B. person.fullName
) zuzugreifen, wird JavaScript an diese Getter-Funktion delegieren, die zufällig auf dem Name.prototype
-Objekt liegt.
Darüber hinaus "bindet die festgelegte -Syntax eine Objekteigenschaft an eine Funktion, die aufgerufen wird, wenn versucht wird, diese Eigenschaft festzulegen. " Obwohl also jeder Instanz explizit eine fullName
-Eigenschaft zugewiesen wird, sucht javascript tatsächlich nach der set
-Funktion des Prototyps. Wenn du das umgehen willst und person.hasOwnProperty("fullName")
return true hast, könntest du so etwas machen:
Tags und Links javascript inheritance