NodeList对象的length属性readonly,如何验证?

时间:2013-01-31 14:12:11

标签: javascript

length属性的属性描述符对象显示可配置:true,writable:true和enymerable:true但它的行为类似于只读。

我知道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

2 个答案:

答案 0 :(得分:4)

根据{{​​3}}

length是只读的

确实这种显示具有误导性,但这是因为它是一个主机对象,因此它不必像我们习惯的那样表现得像本机对象。这值得一个错误报告,因为显示应该尽可能地匹配行为,特别是在这样的明显情况下。

答案 1 :(得分:1)

DOM speclength定义为readonly:

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

getOwnPropertyDescriptor似乎不应该说它是可写的。但是,NodeList个实例为host objects

  

主机环境提供的对象以完成执行   ECMAScript的环境

因此,他们可以有特殊的行为。事实上,这个是ECMAScript强制执行的:

  

如果属性被描述为数据属性,则可能会返回   随着时间的推移,不同的值,然后[[可写]]中的任何一个或两个   并且[[Configurable]]属性必须为true,即使没有机制   通过其他内部方法更改值。

由于getElementsByName会返回实时收藏集,length可能会发生变化,因此[[可写]]或[可配置]]必须为true。您的实现选择了两者。