javascript中函数的length和name是自有属性而非原型属性,直接存在于函数实例上且只读:length为形参数量(不含rest参数),name为函数名或变量名;function.prototype上不存在这两个属性。

JavaScript 中函数的 length 和 name 属性是函数对象自身的**自有属性(own property)**,不是从原型链上继承来的。它们直接挂在函数实例上,不属于 Function.prototype,因此无法通过原型链访问。
这两个属性存在于函数对象本身
当你定义一个函数时,引擎会自动为其设置 length 和 name,且二者都是只读属性:
- length:值为函数声明中形参的数量(不计入 rest 参数);
-
name:值为函数名(命名函数)或赋值变量名(匿名函数表达式),在多数现代引擎中稳定可用(IE11 及更早版本不支持
name)。
例如:
function foo(a, b) {}<br>const bar = function() {};<br>const baz = (x) => x;<br><br>console.log(foo.length); // 2<br>console.log(bar.length); // 0<br>console.log(baz.length); // 1<br><br>console.log(foo.name); // "foo"<br>console.log(bar.name); // "bar"<br>console.log(baz.name); // "baz"不能通过原型链访问的原因
检查原型链可验证这一点:
-
foo.hasOwnProperty('length')→true; -
foo.hasOwnProperty('name')→true; -
foo.__proto__ === Function.prototype→true; -
Function.prototype.hasOwnProperty('length')→false; -
Function.prototype.hasOwnProperty('name')→false。
也就是说,Function.prototype 上既没有 length,也没有 name。它们不是“方法”或“共享属性”,而是每个函数创建时由引擎注入的实例级元信息。
为什么不是原型属性?
设计上,length 和 name 描述的是**特定函数的签名特征**,而不同函数的这两个值必然不同。如果放在 Function.prototype 上,就无法区分各函数个体——这违背语义。JS 引擎选择将它们作为不可枚举、不可写、不可配置的自有属性,确保每个函数拥有独立、准确的元数据。
补充说明:arguments.length 是另一回事
注意别混淆:
- fn.length 是函数定义时的形参个数(静态);
- arguments.length 是调用时实际传入的实参个数(动态,仅存在于非箭头函数内部);
- 后者与原型链无关,也不是函数对象的属性,而是每次调用生成的类数组对象的自有属性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











