javascript - Javascript 代理在 Array.push() 上的行为不同并由索引设置
问题描述
我正在处理类似于以下代码段的代码:
let arr = [];
let arr_handlers = {
set: function(target, property, value, receiver) {
console.log('setting ' + property + ' for ' + target + ' with value ' + value);
target[property] = value;
return true;
}
};
let arr_proxy = new Proxy(arr, arr_handlers);
arr_proxy.push(1);
// setting 0 for with value 1
// setting length for 1 with value 1
arr_proxy[1] = 5;
// setting 1 for 1 with value 5
console.log(arr.length);
// 2
问题是代理在我使用arr_proxy.push()
和通过索引设置值时的行为不同:
当数组值由索引设置时,为什么不调用代理设置器来设置长度?
解决方案
当数组值由索引设置时,为什么不调用代理设置器来设置长度?
因为length
数组特有的动态属性只存在于代理内部target
的,上。
相反,该push
方法确实.length
在其接收器上显式设置了属性。它不会通过分配给索引而自动触发。你可以试试
const obj = { length: 0, push: Array.prototype.push };
obj.push(5)
console.log(obj) // { length: 1, 0: 5 }
arr_proxy.push(5)
您可以通过编写实现与调用相同的行为
const _len = arr_proxy.length;
arr_proxy[_len] = 5;
arr_proxy.length = _len + 1;
推荐阅读
- r - ggplot2 r改变背景颜色
- apache - 如何让服务器端包含在安装在 Centros 7 上的 Apache 上工作?
- windows - 有没有办法可以批量删除 900ish 文件的部分文件名?
- ruby - Ruby 循环直到设定时间,如果条件返回 false,则引发异常
- c# - _UserManager.CreateAsync() 返回成功但不将用户保存在数据库中
- python-3.x - 以下代码中的“s or s[0] in Yy”是什么?
- vert.x - 完成处理程序承诺会影响 Vert.x 的阻塞线程检查器吗?
- c# - c# ASP.NET 会话变量未初始化或更新
- c++ - 如何在一个类中对一个数据结构进行模板化(同一个 .h 文件)
- javascript - 如何让这个按钮触发适当的事件