ES6 代理设置 属性 陷阱未触发数组长度
ES6 Proxy set property trap not firing for array length
使用 JavaScript ES6 代理时,array.length 的设置 属性 陷阱在直接分配数组索引时不会触发。
例如:
const proxy = new Proxy([], {
set: function(obj, name, value) {
console.log(`set: ${name}`);
obj[name] = value;
return true;
}
});
proxy.push(0);
proxy[1] = 1;
Chrome 51 和 Firefox 47 输出:
set: 0
set: length
set: 1
虽然我希望:
set: 0
set: length
set: 1
set: length
这是符合规格的吗?我找不到这方面的任何信息。
在给索引赋值时,不需要显式设置length
属性。之所以设置为push
,确实是在specification中定义的:
Repeat, while items is not empty
a. Remove the first element from items and let E be the value of the element.
b. Let setStatus be Set(O, ToString(len), E, true).
c. ReturnIfAbrupt(setStatus).
d. Let len be len+1.
- Let setStatus be Set(O, "length", len, true).
基本上:如果发生错误,则设置正确的长度以防数组已经扩展。
使用 JavaScript ES6 代理时,array.length 的设置 属性 陷阱在直接分配数组索引时不会触发。
例如:
const proxy = new Proxy([], {
set: function(obj, name, value) {
console.log(`set: ${name}`);
obj[name] = value;
return true;
}
});
proxy.push(0);
proxy[1] = 1;
Chrome 51 和 Firefox 47 输出:
set: 0 set: length set: 1
虽然我希望:
set: 0 set: length set: 1 set: length
这是符合规格的吗?我找不到这方面的任何信息。
在给索引赋值时,不需要显式设置length
属性。之所以设置为push
,确实是在specification中定义的:
Repeat, while items is not empty
a. Remove the first element from items and let E be the value of the element.
b. Let setStatus be Set(O, ToString(len), E, true).
c. ReturnIfAbrupt(setStatus).
d. Let len be len+1.
- Let setStatus be Set(O, "length", len, true).
基本上:如果发生错误,则设置正确的长度以防数组已经扩展。