2013-06-21 5 views
1
var o = { a: 1 }; 
delete o.a; 

Я хочу получать уведомление, когда свойство удалено, аналогично дескрипторам доступа getter и setter.Возможно ли узнать, когда свойство будет удалено?

Возможно ли это?

+0

Я не понимаю. Он удаляется в этой точке кода, где 'delete o.a'. Значит, вы знаете, когда и где вы удаляете материал. – Amberlamps

+0

№ Javascript не имеет такого механизма. – Zirak

+0

@Amberlamps Не так просто. Используя то же правило, я знаю, когда выполняются 'o.a = 1' и' o.a', но я могу настроить геттеры и сеттеры. Я хотел бы иметь еще одну функцию, похожую на геттеры и сеттеры, которая выполняется, когда 'o.a' удаляется. –

ответ

1

Благодаря @MarkGraham я нашел спецификации для предложения спецификации Object.observe() для javascript-гармонии.

http://wiki.ecmascript.org/doku.php?id=harmony:observe

Но это не реализовано в Node.js (после быстрого поиска).

Я также нашел Proxies, более мощный способ перехвата операций. Это также из Гармонии, но в node.js можно включить, используя флаг -harmony-proxies или -harmony, чтобы включить все функции гармонии.

Редактировать: Node.js реализует более старую версию прокси-серверов гармонии. Это последнее: direct proxies и пример, который они предоставляют, не работает должным образом. google groups

+0

Я не думаю, что вы хотели бы «Object.observe» с его асинхронным уведомлением * в любом случае. Прокси - это путь. – Bergi

0

Для этих вещей в js нет встроенной системы уведомлений. Но я считаю, что самое простое решение: вызвать метод с кодом управления удалением (например, вы сделали бы с уведомлениями) после удаления свойства.

1

Если вы можете контролировать свою окружающую среду и обеспечить ее актуальность, тогда отлично. Эта статья об Object.observer поможет.

http://updates.html5rocks.com/2012/11/Respond-to-change-with-Object-observe

В противном случае, если вы питания для старых браузеров, то вам, возможно, придется написать его самостоятельно. Всегда есть выступление в глубине души. Новые браузеры реализуют «Рабочие потоки» и, по-видимому, это то, что Object.observe будет обеспечивать ресурсами. Старые браузеры выполняют javascript в одном потоке, поэтому у вас нет этого преимущества.

Вам нужно будет использовать таймер, но просто «один», а не несколько ... Джон Ресиг (Mr jQuery) написал различные статьи о таймерах и о том, как они выполняются в одном потоке. Вот один из них:

http://ejohn.org/blog/how-javascript-timers-work/

Примечание. Я не пробовал это сам, поэтому не знаю, будет ли производительность приемлемой.

+0

Он сказал, что Node.js! – Bergi

+0

Приношу свои извинения. Было бы яснее, если бы Node.js упоминался в названии, так как я не попал сюда через меню «Метки». –