为了账号安全,请及时绑定邮箱和手机立即绑定

为什么普通对象没有length属性,而唯独arguments等类数组对象拥有length属性?

为什么普通对象没有length属性,而唯独arguments等类数组对象拥有length属性?

桃花长相依 2022-01-05 23:19:35
为什么普通对象没有length属性,而唯独arguments等类数组对象拥有length属性?以下是我还疑惑的地方:现在才知道:原来所有的我所认为的类(string等)其实都不过是构造函数,因为是函数所以都继承Function.prototype;原来函数都具有length和prototype属性,且length属性只示自身,其原型属性并没有。关于原型链,我有研究过的,查找属性是沿着原型链;类比过作用域链,查找变量是沿着作用域链的。关于我提出的问题,结合你提供的信息,我对其的解释是:因为普通的实例化一个对象,他们也就继承自Object.prototype原型的属性和方法,而继承的原型对象是没有length属性的,所以使用length属性的结果就是undefined。对于arguments对象,我还是有点疑惑:alert(typeof arguments); // object ---->这说明他是object 而不是 function alert(Object.getPrototypeOf(arguments)); //[object Object] ---->结合上面的结果object,说明:arguments所继承的原型是Object.prototype,而Object.prototype是没有定义length属性的,所以length属性是arguments这个对象所特有的??是ECMAscript标准里面定义好的??因为同样是对象,如 var obj={x:'hello',y:'boy'} ,同样继承Object.prototype原型对象,但是他们却没有length这样的自有属性。
查看完整描述

2 回答

?
慕斯王

TA贡献1864条经验 获得超2个赞

正如我之前所说

Arguments对象确实是特殊的对象, 它就是这麽设计的

再次阅读构造Arguments对象的步骤

7. 调用内部[[DefineOwnProperty]]方法 (也就是设置私有属性方法)

调用参数为 ('length',{[[Value]]: len, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true})

这个对象的length是直接附上去的

可以这样模拟这个过程


a = {}Object.defineProperty(a,'length',{value : 0,writable : true,enumerable : false,configurable : true})alert(a.length)alert(a.hasOwnProperty('length'))


查看完整回答
反对 回复 2022-01-09
?
三国纷争

TA贡献1804条经验 获得超7个赞

没什麽特别的, Arguments Object就是这麽设计的
在ECMA-262.pdf 10.6有详细说明它是怎麽构造的

1. len = 参数的数量
2. obj = 新创建一个ECMAScript对象
..
4. 给obj的内部[[Class]]属性设置为 'Arguments'
这个你可以通过alert({}.toString.call(arguments))查看
..
7. 调用内部[[DefineOwnProperty]]方法 (也就是设置私有属性方法)
调用参数为 ('length',{[[Value]]: len, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true})
..
...
这就表明length是单纯的直接赋值给Arguments Object的, 没有什麽神秘的
你自己new Object, 没有给它设置length属性当然没有了



查看完整回答
反对 回复 2022-01-09
  • 2 回答
  • 0 关注
  • 370 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信