2016-06-18 17 views

Antwort

3

Object selbst hat einige Methoden definiert, wie Object.keys. Diese sind nicht unter Object.prototype definiert, sodass sie für Objektinstanzen nicht verfügbar sind.

+0

dang, ja ich weiß nicht, wie das für mich nicht offensichtlich war, sehr seltsam, keine Hilfsfunktionen auf den Prototyp zu setzen – neaumusic

+0

Nein, es ist nicht. Wenn das passiert wäre, könntest du keine Methode namens 'keys()' zum Beispiel definieren, es wäre ein Alptraum für Rückwärtskompatibilität –

1

Technisch gesehen ist Object (der Konstruktor) nicht vom Typ object, es ist eine Klasse/Funktion, je nachdem, welchen Ausdruck Sie mit JS verwenden möchten. Da es sich um eine Klasse handelt, enthält sie Methoden, die nicht in Instanzen dieses Objekts verwendet werden. IE: Sie sind nicht auf dem Prototyp der zurückgegebenen Objekte.

In Ihrer Chrome-Konsole, versuchen Sie dies:

var obj = {}; 
typeof obj; // "object" 
typeof Object; // "function" 

Blick in die Prototyping-Weg-Klasse arbeitet in JS, wenn Sie eine Chance bekommen.

Um ein wenig zu verdeutlichen, wenn Sie new Object() ausführen, gibt es etwas mit dem Typ object zurück, der über die erforderlichen Methoden verfügt.

Ich denke, das ist eine gute Referenz von dem, was ich spreche: JavaScript - The Good Parts: Function prototypes vs Object prototypes

Sie können das gleiche Verhalten mit Number und String sehen. Die Typen von beiden sind eigentlich function, aber sobald sie erstellt werden, erhalten Sie eine der Art number oder string, jeweils mit ihren relevanten Prototyp-Methoden.

Die untere Zeile ist der Konstruktor ist nicht das gleiche wie der zurückgegebene Wert.

+0

was ist mit Strings oder Zahlen? – JordanHendrix

+0

das ist einfach falsch ... – JordanHendrix

+0

@JordanHendrix Eigentlich ist es nicht. – Jacques

3

Konstrukteurs haben zwei getrennte Arten von Methoden:

  • prototypische Methoden

    Definiert als Eigenschaften von Constructor.prototype, sind die nur auf Instanzen zur Verfügung.

  • Statische Methoden

    Definiert als Eigenschaften von Constructor selbst, sind die einzige auf den Konstruktor zur Verfügung.

ES6 classe deutlich machen

class Constructor { 
    static foo() { return 123; } 
    bar() { return 456; } 
} 
Constructor.foo(); // 123 
Constructor.bar; // undefined 
new Constructor().foo; // undefined 
new Constructor().bar; // 456 

Ihr Fall besondere ist jedoch: Die statischen Methoden der Object Konstruktor scheinen die prototypische Methoden aufzunehmen. Aber das liegt daran, Object erbt von Object.prototype.

Die prototypische Ketten sind wie

  • Object Instanz

    instance -> Object.prototype -> null 
    
  • Object Konstruktor

    Object -> Function.prototype -> Object.prototype -> null 
    
+2

Haha, du musstest es nur besser erklären als ich +1 – Jacques

Verwandte Themen