Javascript 如果数组的'length'属性直接减少,如何获取已删除的项(用于代理的后期处理)?
JavaScript(ECMAScript 6) 我为Javascript 如果数组的'length'属性直接减少,如何获取已删除的项(用于代理的后期处理)?,javascript,arrays,proxy,Javascript,Arrays,Proxy,JavaScript(ECMAScript 6) 我为数组项编写了一个代理。我这样做是为了解决问题。。。我以这样的例子来说明这个问题: function Node(value){ this.parent = null; // parent Node item this.value = value; this.children = []; // child Node items } 我希望children数组中的每个项在将该项添加到该数组或从中删除时都将更新自己的parent属性 下
数组项编写了一个代理。我这样做是为了解决问题。。。我以这样的例子来说明这个问题:
function Node(value){
this.parent = null; // parent Node item
this.value = value;
this.children = []; // child Node items
}
我希望children
数组中的每个项在将该项添加到该数组或从中删除时都将更新自己的parent
属性
下面是我关于单元测试的决定。我对俄文评论表示歉意(你可以用你感兴趣的翻译)
我还将代码放在JSFIDLE上(此资源显示代码行号)
你可以看到我的一个测试失败了。。。当我通过直接减少数组的length
属性来删除项时,就会发生这种情况。我看到deleteProperty
处理程序没有捕获此事件
也就是说,我的问题是,这种项目删除变体存在:
myarray.length -= 1;
在这种情况下,最后一项将从数组中删除,但其父项
属性将不会更新为null
值
我怎样才能通过代理抓住这种情况
多谢各位
/*这是我测试的模块。我的QUnit测试从代码行118开始。
失败的测试位于代码行351上*/
(职能(出口){
/* Массив, автоматически управляющий ссылками на родителя для всех своих
* дочерних элементов при их добавлении или удалении.
*
*项目名称-项目名称
* обновляться у каждого элемента массива.
*
*家长-家长
*名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称。
*
* ВНИМАНИЕ!
* Если удалять элементы из хвоста прокси-массива посредством назначения
*长度
* свойство, подлежащее мониторингу, НЕ обновит своё значение! Поэтому не
* следует пользоваться таким способом удаления элементов из прокси-массива,
*带ParentLink的阵列。带ParentLink的阵列
*цццpop()、shift()和拼接()。
*/
exports.ArrayWithParentLink=函数(propName,父级){
/** Выяснение того, является ли ключ корректным индексом массива.
*ECMAScript 6。
*СМ.аазаааачаааааааааааааа107。
* */
函数isArrayIndex(键){
const toUint32=函数(值){
返回Math.floor(Math.abs(Number(value)))%Math.pow(2,32);
};
设numericKey=toUint32(键);
返回字符串(numericKey)=key&&numericKey<(Math.pow(2,32)-1);
};
/* Редактирование состава вложенного массива будем выполнять через
* прокси, дабы автоматизировать синхронизацию значения свойства,
*名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称名称
* прокси-массива. */
变量arrayChangeHandler={
设置:功能(目标、键、值、接收器){
/* Если имя свойства является допустимым индексом массива,
* значит выполняется операция над элементом массива... */
if(isArrayIndex(键)){
值[propName]=父项;
/* Очистить значение свойства (имя которого указано в
*项目名称)项目名称
* имеется только одна ссылка. В некоторые моменты в массиве
* может присутствовать одновременно несколько ссылок на
* один и тот же элемент. Пример такого случая приведён в
* комментарии ниже.*/
如果((输入目标)和&target[输入]&&
(目标[key]中的propName){
/* Если выполняется ВСТАВКА новых элементов методом
*数组.prototype.splice()
* массиву необходимого количества дополнительных ячеек,
* в которые записываются ссылки на уже существующие
* элементы массива, а их прежние ячейки переписываются
* ссылками на вставляемые элементы. Т.е. до того, как
* произойдёт перезапись, в составе масс?
set(key,value,target){
if(key==="length"){
for(var i=0;i<value-target[key];i++){
var removed=target.pop();
///change removed...
}
return;
}
//change target[key]
}