2016-09-20 6 views
1

https://danmartensen.svbtle.com/the-anatomy-of-a-javascript-function#creating-function-instances_3Wie JavaScript-Funktion Objekte angelegt und erhalten ihre inneren Eigenschaften

Ich versuche, diesen Artikel auf zu verstehen, wie JavaScript-Funktion Objekte erstellt werden. Dort heißt es:

The new instance object is implicitly assigned many internal properties, one being the [[prototype]] property. The Function constructor’s prototype property referencing it’s prototype object is copied into this new object’s [[prototype]] property

Basing auf die obige Aussage i diesen Code schrieb:

function Person(){ 

} 

console.dir(Function.prototype); 
console.dir(Person.prototype); 

nach der Aussage Function.prototype zu einer neu geschaffenen Funktion des Objekts prototpe zugeordnet (Person.prototype in diesem Fall). Ich habe beide gedruckt. Inhalt sieht anders aus.

Kann jemand erklären, wo mein Verständnis falsch ging. Durch die Art, wie ich auch auf ECMAScript-Spezifikationen sah, hat es die gleiche Aussage

enter image description here

+0

JavaScript-Funktionen Nach Objekte sind. Selbst Ecmascript nennt das gleiche http://www.ecma-international.org/ecma-262/5.1/#sec-13.2 –

+0

Ich möchte wissen, wie jede Funktion ihre internen Eigenschaften und Methoden wie Prototyp, Aufruf, Bindung usw. erhält. –

Antwort

2

Sie erleben die klassische Verwechslung zwischen der -Eigenschaft und dem Prototyp eines Objekts. Sie sind völlig verschieden, obwohl verwandt.

Die Eigenschaft einer Funktion ist ein Objekt, das als Prototyp für Objekte festgelegt wird, die mit dieser Funktion als Konstruktor erstellt werden. Anfangs ist es ein leeres Objekt mit Ausnahme einer Eigenschaft constructor, die auf den Konstruktor verweist.

Der Prototyp (nicht die Eigenschaft prototype) ein Objekt festgelegt wird, wenn das Objekt erzeugt wird, aus der prototype Eigenschaft des Konstruktors. Es kann als die __proto__ Eigenschaft bezeichnet werden oder über Object.getPrototypeOf abgerufen werden.

In Ihrem Fall hat Person eine prototypeEigenschaft die zunächst grundsätzlich leer mit Ausnahme der constructor Eigenschaft ist. Es hat nichts mit der prototype Eigenschaft des Function Objekts zu tun. Es wird der Prototyp der Instanzen Person erstellt über new Person(). Sie können Ihre eigenen Methoden und Eigenschaften hinzufügen, wie in Person.prototype.alert = function() { alert(this.name); };.

Völlig getrennt von seiner prototypeEigenschaft hat Person einen Prototyp, der von der prototype Eigenschaft des Function Objekt kommt, da Person implizit den Function Konstruktor erstellt wird. Das ist wo Person bekommt bind usw. (obwohl, wenn Sie beabsichtigen, Person als Konstruktor zu verwenden, bezweifle ich, ob Sie viel für bind finden würde).

Um eine bessere Vorstellung zu bekommen, versuchen Sie folgendes in die Konsole:

function Person() { } 
Person.__proto__ === Function.prototype // true 
Function.prototype.isPrototypeOf(Person) // true 
Object.getPrototypeOf(Person) === Function.prototype // true 
+0

Perfekt erklärt. Danke für die Bearbeitungen, um es verständlicher zu machen –

5

Laut Aussage wird Function.prototype zugewiesen ein neu geschaffene Funktion des Objekts Prototyp (Person.prototype in diesem Fall)

Nein. Der Text spricht über internal properties, wie [[Prototyp]]. Sie können nicht als normale Eigenschaft darauf zugreifen, Sie können darauf zugreifen, indem Sie Object.getPrototypeOf verwenden. Und in der Tat,

Object.getPrototypeOf(Person) === Function.prototype // true 

Die .prototype Eigenschaft ist eine andere Sache. Es wird auch bei der Instantiierung des Funktionsobjekts erstellt, aber es wird mit einem Objekt gefüllt, das von (hat [[Prototyp]]) Object.prototype erbt und enthält eine Eigenschaft .constructor, die auf die Funktion verweist. Dieses Objekt wird zum [[Prototyp]] von Instanzen, die unter Verwendung von new Person erstellt wurden.

+0

Sie können nicht als normale Eigenschaft darauf zugreifen ". Aber wir fügen Eigenschaften zum Prototyp hinzu? um diese Eigenschaften für alle Instanzen dieser Funktion verfügbar zu machen –

+0

Ja, auf die Eigenschaften * von * dem Objekt, auf das durch [[Prototyp] verwiesen wird, kann normal zugegriffen werden, weil sie vererbt werden (worum es eigentlich geht), aber Der Link [[Prototyp]] selbst kann nicht über eine Eigenschaft aufgerufen werden. – Bergi

Verwandte Themen