JavaScript-Eigenschaften mit Setter-Methoden sind keine realen Eigenschaften?

8
%Vor%

Gibt es eine Möglichkeit, die Eigenschaften zurückzugeben?

    
iksose 28.12.2014, 02:50
quelle

3 Antworten

3

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:

  1. Verwenden Sie eine for..in Schleife:
%Vor%
  1. Fügen Sie die Eigenschaften in Ihrem Konstruktor hinzu:

%Vor%
  1. Erstellen Sie ein ganz neues Objekt in Ihrem Konstruktor, indem Sie die get / set-Syntax verwenden, die Sie dort haben. In diesem Fall würden wir das Schlüsselwort new nicht verwenden, sondern einfach die Funktion:
  2. aufrufen

%Vor%
    
JLRishe 28.12.2014, 03:52
quelle
6

hasOwnProperty überprüft nicht die Prototypkette des Objekts, in Ihrem Fall werden die Personen get und set über die Prototypkette

vererbt

hasOwnProperty

  

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.

%Vor%

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%     
InferOn 28.12.2014 03:32
quelle
0

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:

%Vor%     
Keenan Lidral-Porter 28.12.2014 03:32
quelle

Tags und Links