2013-01-31 37 views
3

長度屬性的屬性描述符對象顯示可配置:true,writable:true和enymerable:true,但其行爲類似於只讀。NodeList對象的length屬性只讀,如何驗證?

我知道readonly特性只能通過PDO(屬性描述符對象)來實現。

有人可以提供任何線索嗎? 這是隻讀嗎?

var nodeList = document.getElementsByName('demo'); 

nodeList.length; //3 
nodeList.length = 6; 
nodeList.length; //3 

Object.getOwnPropertyDescriptor(nodeList,'length') 
Object 
configurable: true 
enumerable: true 
value: 3 
writable: true 
__proto__: Object 
+3

DOM元素具有本機實現。有人可能會將自己的行爲限制在Javascript反射元數據告訴你的範圍之上。 – millimoose

回答

4

length是隻讀的,按照http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-536297177

確實的,顯示有誤導之嫌,但這是因爲它是一個宿主對象,所以它並沒有表現得像本地對象一樣我們習慣於。儘管這是值得一個錯誤報告,因爲顯示應儘可能匹配行爲,特別是在這樣的明顯情況下。

+1

確實 - 似乎是一個錯誤。應該與JavaScript引擎有所不同。如果在不同的瀏覽器中嘗試,我們是否會期望有不同的行爲? – sbose

+2

在Opera中,它是一個getter/setter屬性。 – Bergi

1

DOM spec定義length爲只讀:

interface NodeList { 
    getter Node? item(unsigned long index); 
    readonly attribute unsigned long length; 
}; 

它可能看起來getOwnPropertyDescriptor不應該說,這是可寫的。然而,NodeList實例是host objects:由主機環境提供

對象來完成的ECMAScript

的執行 環境

因此,他們可以有特殊的行爲。事實上,這一個是由ECMAScript強制執行:

如果屬性被描述爲一個數據屬性並將其可能隨時間而返回 不同的值,則任一或兩者的[[可寫] 和[可配置]]屬性必須爲真,即使沒有任何機制可以通過其他內部方法更改公開值。

由於getElementsByName返回現場收集,length可能會改變,所以[可寫]或[配置]必須true。你的實現選擇了兩者。