2016-11-17 14 views
1
proxy = new Proxy({}, { 
    deleteProperty(target, propKey){ 
    console.log(arguments); 

    return true; 
    } 
}); 

proxy.xx = 3; 

delete proxy.xx; // log and return true 

proxy.xx // 3 

Как и код, операция удаления не имеет эффекта.Как удалить свойство объекта, созданного прокси?

Я прочитал delete operator на MDN:

Функция удаления оператор удаляет данное свойство из объекта. При успешном удалении оно вернет true, иначе будет возвращено false. Тем не менее, важно рассмотреть следующие сценарии:

  • Если свойство, которое вы пытаетесь удалить, не существует, удалять не будет иметь никакого эффекта, и возвращает истину

  • Если свойство с тем же именем существует в цепочке прототипов объекта, а затем после удаления объект будет использовать свойство из цепи прототипа (другими словами, удаление только влияет на собственные свойства).

  • Любое свойство, объявленное с помощью var, не может быть удалено из глобальной области действия или из области действия.

    • Таким образом, delete не может удалять любые функции в глобальной области видимости (независимо от того, является ли это частью определения функции или выражения функции).

    • Функции, которые являются частью объекта (кроме глобальной области), могут быть удалены с удалением.

  • Любое свойство, объявленное с let или const, не может быть удалено из области действия, в которой они были определены.

  • Неконфигурируемые свойства не могут быть удалены. Сюда входят свойства встроенных объектов, таких как Math, Array, Object и свойства, которые создаются как неконфигурируемые с помощью методов Object.defineProperty().

Я думаю, что мой код не относится к указанным выше, поэтому как его объяснить? Благодарю.

ответ

2

Если вы хотите удалить недвижимость, вам необходимо позвонить в Reflect.deleteProperty(). Только возвращение true не удаляет его, он только делает звонки Reflect.deleteProperty() возвращения true:

const proxy1 = new Proxy({}, { 
 
    deleteProperty(target, propKey) { 
 
    return true; 
 
    }, 
 
}); 
 

 
proxy1.xx = 3; 
 
// true, because deleteProperty trap returns true. 
 
console.log(Reflect.deleteProperty(proxy1, 'xx')); 
 
// 3, because it wasn't actually deleted. 
 
console.log(proxy1.xx); // 3 
 

 
const proxy2 = new Proxy({}, { 
 
    deleteProperty(target, propKey) { 
 
    Reflect.deleteProperty(target, propKey); 
 
    return false; 
 
    }, 
 
}); 
 

 
proxy2.xx = 3; 
 
// false, because deleteProperty trap returns false. 
 
console.log(Reflect.deleteProperty(proxy2, 'xx')); 
 
// undefined, because it was deleted. 
 
console.log(proxy2.xx);

+0

'Reflect.deleteProperty' не требуется. Вы можете просто выполнить 'delete target [k]' – Pacerier

1

В spec вы можете увидеть, что если в прокси реализован deleteProperty обработчик этот обработчик просто вызов с параметрами target, P, где target - это исходный объект, а P - свойство для удаления.

Если вы вернетесь от этого обработчика true, как в вашем примере, ничего не произойдет.

Итак, если добавить этот обработчик, вы должны удалить необходимое свойство вручную, или как в ближайшем ответ с Reflect

proxy = new Proxy({}, { 
 
    deleteProperty(target, propKey) { 
 
    console.log(target, propKey); 
 
    delete target[propKey]; 
 
    return true; 
 
    } 
 
}); 
 

 
proxy.xx = 3; 
 
console.log('before', proxy.xx); 
 
console.log('delete', delete proxy.xx); // log and return true 
 

 
console.log('after', proxy.xx); // 3
.as-console-wrapper { 
 
    top: 0; 
 
    height: 100% !important; 
 
}

 Смежные вопросы

  • Нет связанных вопросов^_^