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
答案 0 :(得分:4)
length
是只读的
确实这种显示具有误导性,但这是因为它是一个主机对象,因此它不必像我们习惯的那样表现得像本机对象。这值得一个错误报告,因为显示应该尽可能地匹配行为,特别是在这样的明显情况下。
答案 1 :(得分:1)
DOM spec将length
定义为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
。您的实现选择了两者。