2012-12-27 7 views
6

Was ist die statische Eigenschaft length des Konstruktors Function, Array und Object?Was ist die Längeneigenschaft der Konstruktoren Function, Array und Object?

Statische Methoden macht Sinn, aber was Länge statische Eigenschaft?

Object.getOwnPropertyNames(Array) 
["length", "name", "arguments", "caller", "prototype", "isArray"] 

Object.getOwnPropertyNames(Function) 
["length", "name", "arguments", "caller", "prototype"] 

Hinweis: Ich erhalte Antworten über Länge Eigentum von Function.prototype, die hier nicht gefragt.

Object.getOwnPropertyNames(Function.prototype) 
["length", "name", "arguments", "caller", "constructor", "bind", "toString", "call", "apply"] 

Object.getOwnPropertyNames(Object) 
["length", "name", "arguments", "caller", "prototype", "keys", "create", "defineProperty", "defineProperties", "freeze", "getPrototypeOf", "getOwnPropertyDescriptor", "getOwnPropertyNames", "is", "isExtensible", "isFrozen", "isSealed", "preventExtensions", "seal"] 
+2

ECMA-262 3. Auflage, Abschnitte * 15.2.3 *, * 15.3.3 * und * 15.4.3 * angeben, dass alle diese Konstrukteure haben eine 'length' Eigenschaft, deren Wert 1. – DCoder

+0

Vielen Dank für Klärung :) aber warum 1 einen bestimmten Grund? –

Antwort

6

Array, Function und Object sind alle Konstrukteure, so dass sie alle Funktionen. Die length -Eigenschaft einer Funktion gibt die Anzahl der (benannten) Argumente an, die die Funktion benötigt. Von ECMA-262 3. Auflage, Kapitel 15:

Jedes integrierte Funktion Objekt in diesem Abschnitt beschrieben-ob als Konstrukteur, eine gewöhnliche Funktion oder eine Länge Eigenschaft, deren Wert sowohl-hat eine ganze Zahl. Sofern nicht anders angegeben, entspricht dieser Wert der größten Anzahl von benannten Argumenten, die in den Abschnittsüberschriften für die Funktionsbeschreibung angezeigt werden, einschließlich optionaler Parameter.

Und DCoder wies darauf hin:

ECMA-262 3. Auflage, Abschnitte 15.2.3, 15.3.3 und 15.4.3 angeben, dass alle diese Konstrukteuren eine Länge Eigenschaft haben, deren Wert 1 . Um Ihren Punkt über statische Felder

: da es keine Klassen in JavaScript Es gibt nicht so etwas wie statische Felder in JavaScript ist. Es gibt nur primitive Werte, Objekte und Funktionen. Objekte und Funktionen (die sich auch als Objekte verhalten) haben Eigenschaften.

Eine Sache, die verwirrend sein kann, ist, dass Function in der Tat ist eine Funktion. Eine wenig bekannte Tatsache ist, dass Sie mit diesem Konstruktor Funktionen erstellen können. Zum Beispiel:

var identity = new Function("a", "b", "return a") 
console.log(identity(42)) 

Die oben wird 42 drucken. Beachten Sie jetzt zwei Dinge: Function nimmt tatsächlich Argumente und tut etwas mit ihnen; und ich habe dem Konstruktor Function mehr als ein Argument übergeben, obwohl Function.length gleich 1 ist. Das Ergebnis, identity, ist auch eine Funktion, deren length Eigenschaft auf den Wert 2, da sie eine Funktion mit zwei Argumenten sind.

+0

Ich interessiere mich für die statische Länge der Funktionsklasse und nicht für die Längeneigenschaft einzelner Instanzen oder Funktionsobjekte. Sie sprechen über Function.prototype nicht Function. Object.getOwnPropertyNames (Funktion.Prototyp) gibt auch Länge Eigenschaft, die andere Sache ist. –

+2

Ich versichere Ihnen, wir reden über die gleiche Sache. 'Function.length' ist gleich' 1', weil 'Function' eine Funktion ist (das ist der verwirrende Teil), die ein einzelnes benanntes Argument hat. Beachten Sie, dass "Function" mehr als ein Argument erkennt, aber nur einer in der internen Implementierung benannt wird. – seliopou

+0

Jede Eigenschaft im Konstruktor wird von allen Funktionsobjekten gemeinsam genutzt. Liege ich falsch? –

0

Alle oben genannten sind Funktionen, die eine Eigenschaft Länge hat, die Funktion nimmt tjhe Anzahl von Argumenten zu sagen. Deshalb haben sie hier die Länge als statische Variable.

fun = function(a) { alert(a); } 
//fun.length = 1 
+0

Diese Längeneigenschaft wird von Function.prototype not Function geerbt. –

Verwandte Themen