2017-11-10 1 views
0

Ich bin ziemlich verwirrt über die Prototyp-Kette und Vererbung in JavaScript. Das Date() -Objekt hat zum Beispiel die Member-Methoden/Funktionen wie Date.now(). Warum erzeugt es dann, wenn Sie eine neue Instanz des Date() -Objekts erstellen und die now() -Methode aufrufen, einen Fehler? new Date.now() Aber beim Aufruf einer Prototyp-Methode wie getTime funktioniert Caling new Date().getTime() funktioniert aber nicht Date().getTime() ohne eine neue Instanz zu erstellen. Warum das? Ich hatte das Verständnis, dass Prototypen von Objekten Teil des ursprünglichen Objekts werden? Zum Beispiel:Prototypen und Klasse/Konstruktor/Objekt-Mitglieder

function Person(firstName, lastName) { 
    this.firstname = firstName; 
    this.lastname = lastName; 
    this.getfirstName =() => { 
       return this.firstName; 
    } 
} 

Person.prototype.getlastName =() => { 
     return this.lastName; 
} 

der Prototyp Methode nicht Mitglied Verfahren von PersongetlastName werden und ohne Verwendung des new Schlüsselwörter wie zugegriffen werden, wie es mit getTime() für Date() verwendet werden muss?

+0

'getLastName' kehrt' this.lastName' was bedeutet es für die Instanz wirkt. Checkout http://javascriptdissexy.com/javascript-prototype-in-plain-detailed-language/ es könnte einige Dinge klären. –

Antwort

1

Prototype fügt eine Instanzmethode hinzu, dh sie wird an Instanzen der Klasse angehängt. Für Ihr Beispiel wird die Funktion getlastName nur wie so genannt werden:

var p = new Person("first","last"); 
p.getlastName(); 

oder

new Person("first","last").getlastName(); 

Wenn Sie getlastName wollen die Klasse selbst angebracht werden, müssen Sie nicht Prototype verwenden:

Person.getlastName =() => { return this.lastName } 

Im Fall der Klasse Date ist now eine statische Methode (verwendet nicht Prototype), während getTime eine Instanzmethode ist (verwendet Prototype). Sie können es in seiner Dokumentation: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

Hier ist ein Verweis auf statische und Prototyp Methoden: http://blog.anselmbradford.com/2009/04/09/object-oriented-javascript-tip-creating-static-methods-instance-methods/

+0

Ich verstehe. Das klärt die Dinge ein wenig auf. Vielen Dank. Ich komme von einem C++ Hintergrund und es verwirrt mich total. Aber nur noch eine Sache. Wenn Sie sagen, wenn ich möchte, dass getlastName() an die Klasse selbst angehängt wird und "Person.getlastName =() => {return this.lastName}" erzeugt, dann wäre das dasselbe, als ob es im Konstruktor selbst definiert wäre, wie z 'getfirstName()'? Und wenn ich es anschließe, wie du es vorgeschlagen hast, kann man darauf zugreifen, indem du einfach Person.getlatName() machst und es wird Nachname zurückgeben? – henhen