Function、Array 和 Object 构造函数的长度属性是啥?
Posted
技术标签:
【中文标题】Function、Array 和 Object 构造函数的长度属性是啥?【英文标题】:What is the length property of the Function, Array, and Object constructors?Function、Array 和 Object 构造函数的长度属性是什么? 【发布时间】:2012-12-12 14:37:04 【问题描述】:什么是函数、数组和对象构造函数的长度静态属性?
静态方法是有意义的,但是长度静态属性呢?
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"]
【问题讨论】:
ECMA-262 第 3 版,第 15.2.3、15.3.3 和 15.4.3 部分指定所有这些构造函数有一个length
属性,其值为1。
感谢您的澄清 :) 但为什么 1 有任何具体原因?
【参考方案1】:
Array
、Function
和 Object
都是构造函数,所以它们都是函数。函数的length
属性指定函数采用的(命名)参数的数量。来自 ECMA-262 第 3 版,第 15 节:
本节中描述的每个内置函数对象——无论是作为构造函数,还是 普通函数,或两者兼有——具有长度属性,其值为整数。除非另有规定, 此值等于函数描述部分标题中显示的命名参数的最大数量,包括可选参数。
正如 DCoder 指出的那样:
ECMA-262 第 3 版,第 15.2.3、15.3.3 和 15.4.3 节指定所有这些构造函数都有一个长度属性,其值为 1。
关于静态字段的观点:javascript 中没有静态字段之类的东西,因为 JavaScript 中没有类。只有原始值、对象和函数。对象和函数(也可以作为对象)具有属性。
可能令人困惑的一件事是Function
实际上是一个函数。一个鲜为人知的事实是,您可以使用此构造函数创建函数。例如:
var identity = new Function("a", "b", "return a")
console.log(identity(42))
上面将打印42
。现在注意两件事:Function
实际上接受参数并用它们做一些事情;我向Function
构造函数传递了多个参数,即使Function.length
等于1
。结果 identity
也是一个函数,其 length
属性设置为值 2
,因为它是一个有两个参数的函数。
【讨论】:
我对 Function 类的静态长度感兴趣,而不是对单个实例或函数对象的长度属性感兴趣。您说的是 Function.prototype 而不是 Function。 Object.getOwnPropertyNames(Function.prototype) 还返回不同的长度属性。 我向你保证,我们说的是同一件事。Function.length
等于 1
因为 Function
是一个函数(这是令人困惑的部分),它有一个命名参数。请注意,Function
可识别多个参数,但在内部实现中仅命名了一个。
构造函数的任何属性都被所有函数对象共享。我错了吗?
这是不正确的。构造函数内的代码将为对象分配属性,new
关键字会将__proto__
属性分配给Constructor.prototype
,这也将用于属性查找。构造函数的属性与其实例之间没有关系。
f = new Function("x","y","return x+y;"); f.length 为 2,但它特定于变量 f 或此函数。在整个函数类上定义的静态东西呢?【参考方案2】:
上面提到的都是函数,它有一个属性长度,表示函数接受的参数数量。这就是为什么它们在这里将长度作为静态变量。
fun = function( a) alert(a);
//fun.length = 1
【讨论】:
这个length属性是Function.prototype继承的,不是Function。以上是关于Function、Array 和 Object 构造函数的长度属性是啥?的主要内容,如果未能解决你的问题,请参考以下文章
props with type object/array must use a factory function to return the default value
props with type object/array must use a factory function to return the default value
vue中报错Props with type Object/Array must use a factory function to return the default value
VUE props的坑(Props with type Object/Array must use a factory function to return the default value)(代码