Warum haben integrierte Funktionen keine Prototypeigenschaft?

8

Da der ES 5.1-Standard besagt, dass ...

1) Hinweis am Fuß von Ссылка

%Vor%

2) Ссылка

%Vor%

(was bedeutet, dass alle anderen Funktionen dies tun)

... warum haben integrierte Funktionen keine Prototypeigenschaft mehr?:

%Vor%

Außerdem können diese Einbauten nicht als Konstruktoren verwendet werden, selbst wenn ihnen eine Prototypeigenschaft zugewiesen ist:

%Vor%

Wenn umgekehrt die Prototypeigenschaft von einem benutzerdefinierten Objekt entfernt wird, kann sie dennoch als Konstruktor verwendet werden und ordnet dem [[Prototyp]]] der generierten Instanzen tatsächlich ein generisches Objekt zu:

%Vor%

Sind eingebaute Funktionen jetzt entweder als Konstruktoren oder als Funktionen untergegliedert?

[Getestet in den meisten modernen Browsern]

    
AngusC 05.01.2013, 06:42
quelle

1 Antwort

6

Es ist nicht die .prototype , die eine Funktion als Konstruktor verwendet, sondern das Vorhandensein der [[Construct]] interne Methode. Siehe diesen Abschnitt , Schritt 4.

Bei normalen Funktionen, die vom Benutzerskript erstellt werden, ist diese interne Eigenschaft automatisch festgelegt, sodass alle Benutzerfunktionen als Konstruktoren aufgerufen werden können. Dies liegt daran, dass der Interpreter nicht wissen kann, wie der Benutzer diese Methode verwenden möchte.

Bei nativen Funktionen ist die beabsichtigte Verwendung im Voraus bekannt, sodass die JavaScript-Engine entscheiden kann, welche nativen Funktionen als Konstruktoren aufrufbar sein sollen. Ist es sinnvoll, new [].push aufzurufen?

Im Einführungsteil zu integrierten Objekten wird Folgendes erwähnt:

  

Keine der in dieser Klausel beschriebenen integrierten Funktionen, die keine Konstruktoren sind, muss die interne Methode [[Construct]] implementieren, sofern in der Beschreibung einer bestimmten Funktion nicht anders angegeben. Keine der in dieser Klausel beschriebenen integrierten Funktionen darf eine Prototypeigenschaft aufweisen, sofern in der Beschreibung einer bestimmten Funktion nicht anders angegeben.

Und der Grund, IMHO, ist, dass es keinen gültigen realen Anwendungsfall gibt, der das brauchen würde. Es gibt keine gute Erklärung, warum push instanziierbar sein sollte: Was ist der Unterschied zwischen einem neuen push und einem neuen generischen Objekt? Die Instanziierung dieser Funktionen bringt dem Entwickler keinen Wert, aber es wird viele WTFs

    
Sergiu Dumitriu 05.01.2013, 07:02
quelle

Tags und Links