2012-12-27 6 views
6

Function、Array、Objectコンストラクタの長さ静的プロパティとは何ですか?Function、Array、およびObjectコンストラクタのlengthプロパティとは何ですか?

静的メソッドは意味がありますが、長さ静的プロパティはどうですか?

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

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

注:私はここに頼まれていないFunction.prototypeのlengthプロパティについての答えを取得しています。

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版、セクション* 15.2.3 *、* 15.3.3 *と* 15.4.3 *すべてのこれらのコンストラクタは、その値の1 – DCoder

+0

おかげで 'length'性質を持っていることを指定明確化:)しかし、なぜ1つの特定の理由? –

答えて

6

ArrayFunction、およびObjectはすべてのコンストラクタですので、彼らはすべての機能です。関数のlengthプロパティは、関数が取る(名前付き)引数の数を指定します。 ECMA-262第3版から、セクション15:

コンストラクタ、 通常関数、または値の整数であり、長さプロパティを両方とも-有し、このセクションかに記載のすべての組み込み関数オブジェクト。特に指定のない限り、 この値は、オプションのパラメータを含む、関数の説明のセクション見出しに表示される名前付き引数の最大数と同じです。

そしてDCoderが指摘したように:

をECMA-262第3版、セクション15.2.3、15.3.3および15.4.3は、これらすべてのコンストラクタは、値が1であるlengthプロパティを、持っていることを指定

静的フィールドについてのポイント:JavaScriptにはクラスが存在しないため、JavaScriptでは静的フィールドはありません。プリミティブ値、オブジェクト、および関数だけがあります。オブジェクトと関数(オブジェクトとしても動作する)は、のプロパティを持っています。

紛らわしいことは、実際にはFunctionが機能していることです。ほとんど知られていない事実は、このコンストラクタを使用して関数を作成できるということです。たとえば、

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

上記は、42と表示されます。今では2つのことに気付きます。Functionは実際に引数をとり、それらと何かを行います。 Function.length1に等しい場合でも、Functionコンストラクタに複数の引数を渡しました。結果は、identityで、lengthプロパティの値が2に設定された関数でもあります。これは2つの引数を持つ関数であるためです。

+0

個々のインスタンスや関数オブジェクトのlengthプロパティではなく、Functionクラスの静的長さに興味があります。機能ではないFunction.prototypeについて話しています。 Object.getOwnPropertyNames()。プロトタイプ)も、長さのプロパティを返します。 –

+2

私はあなたに保証します、我々は同じことを話しています。 'Function'は単一の名前付き引数を持つ関数(混乱する部分です)であるため、' Function.length'は '1'と等しくなります。 'Function'は複数の引数を認識しますが、内部実装では1つのみが指定されます。 – seliopou

+0

コンストラクタのプロパティは、すべての関数オブジェクトで共有されます。私が間違っている? –

0

上記の関数はすべて、関数の引数の数を表すプロパティの長さを持つ関数です。なぜここに静的変数としての長さがあるのですか?

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

この長さのプロパティはFunctionではなくFunction.prototypeによって継承されます。 –

関連する問題