2013-01-31 85 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。你的实现选择了两者。