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' )) |
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属性当然没有了
添加回答
举报