亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么普通對象沒有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 關注
  • 394 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號