3

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

我知道只读功能只能由 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
4

2 回答 2

4

length是只读的,根据http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-536297177

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

于 2013-01-31T14:20:20.303 回答
1

DOM 规范定义length为只读:

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

似乎不getOwnPropertyDescriptor应该说它是可写的。但是,NodeList实例是宿主对象

宿主环境提供的对象,用于完成 ECMAScript 的执行环境

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

如果一个属性被描述为一个数据属性并且它可能会随着时间的推移返回不同的值,那么即使没有任何改变值的机制通过其他内部方法。

由于getElementsByName返回一个实时集合,length可能会改变,所以 [[Writable]] 或 [Configurable]] 必须是true. 您的实现选择两者。

于 2015-03-26T17:26:30.673 回答