6

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

静的メソッドは理にかなっていますが、長さの静的プロパティはどうですか?

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

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

注:ここで尋ねられていないFunction.prototypeの長さプロパティについての回答を得ています。

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"]
4

2 に答える 2

6

Array, Function, and Object are all constructors, so they're all functions. The length property of a function specifies the number of (named) arguments that the function takes. From ECMA-262 3rd edition, section 15:

Every built-in Function object described in this section—whether as a constructor, an ordinary function, or both—has a length property whose value is an integer. Unless otherwise specified, this value is equal to the largest number of named arguments shown in the section headings for the function description, including optional parameters.

And as DCoder pointed out:

ECMA-262 3rd edition, sections 15.2.3, 15.3.3 and 15.4.3 specify that all these constructors have a length property, whose value is 1.

To your point about static fields: There is no such thing as static fields in JavaScript, as there are no classes in JavaScript. There are only primitive values, objects, and functions. Objects and functions (which behave as objects as well) have properties.

One thing that may be confusing is that Function is in fact a function. A little-known fact is that you can create functions using this constructor. For example:

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

The above will print 42. Now notice two things: Function actually takes arguments and does something with them; and I passed more than one argument to the Function constructor, even though Function.length is equal to 1. The result, identity, is also a function, whose length property is set to the value 2, since it's a function with two arguments.

于 2012-12-27T07:13:01.603 に答える
0

上記のすべては、関数が取る引数の数を示す長さのプロパティを持つ関数です。そのため、ここでは静的変数として長さを持っています。

fun = function( a) { alert(a); }
//fun.length = 1
于 2012-12-27T07:16:51.383 に答える