Можно ли как-то отловить удаление свойства оператором delete?
Сабж. Использую Object.defineProperty (Object.observe и Proxy не предлагайте), может есть хак какой-нибудь?
|
<html> <head> </head> <body> <p id="p" name="Paragraph">foo</p> <script> SubObject={ clone: function(){ var o=Object.create(this) if(this.init) this.init.call(o) return o }, extend: function(o){ for(var i in o) {if(!o.hasOwnProperty(i)) return this; this[i]=o[i]} return this } } DOMEvent=SubObject.clone() .extend({ addTo: function(HTMLObject){ HTMLObject.addEventListener(this.actionName, this.self) HTMLObject.addEventListener(this.actionName, this.emit) }, init: function(){ this.listeners=[] this.emit=function(){this.listeners.forEach(function(listener){listener.notify()})}.bind(this) }, addListener: function(listener){this.listeners.push(listener)}, }) Notifier=SubObject.clone() .extend({ init: function(){this.listeners=[]}, add: function(obj){this.listeners.push(obj); obj[this.action.name]=this.action}, notify: function(){var name=this.action.name; this.listeners.forEach(function(listener){listener[name]()})} }) Person=function(name, job){this.name=name; this.job=job} person1=new Person("Jack", "doctor") person2=new Person("John", "police officer") with(notifier=Notifier.clone()){ extend({action: function hello(){alert("Hello, my name is "+this.name+" and I am "+this.job)}}) add(person1) add(person2) } with(DOMEvent.clone()){ extend({ actionName: "click", self: function(){alert("Hi, friends! I am HTML"+this.getAttribute("name")+". And who are you?")}, }) addTo(p) addListener(notifier) } </script> </body> </html> |
pornoborets, да, за флуд.
|
FINoM,
Так вот слушай, пень, один хрен, мой бан, это вопрос времени. Дело в том, что ты дегенерат. Твой вопрос, сводится к "как я могу иметь свое собтыие?", и абсолютно похеру, какое это именно событие, и какие обработчики. Я выложил, мудак, пример построения интерфейсов для таких событий. Но в силу твоего скудоумия, а также нулевого знания програмирования, ты, естественно ждешь, что тебе выложат готовый скрипт, конкретно для твоего случая, что вполне естественно для дауна. Вот это "настоящий" ответ на твой вопрос, а заодно и на твой коммент. Ты, собственно, это все и сам знаешь, просто дурочку валяешь. |
pornoborets, лол.
Товарищи модераторы, уберите эту интересную личность, пожалуйста. |
Цитата:
|
Цитата:
(условное ветвление алгоритма) Но что то подсказывает что имелось что то другое в виду =). delete - это оператор языка. перегрузки операторов в JS нет. Пока это звучит как просьба подсказать неизвестный костыль для решения неизвестной задачи (слишком много неизвестных). |
Цитата:
sum=function(x, y){return x + y} Number.prototype.sum=function(x){return this+x} Array.prototype.sum=function(x){return this.reduce(sum) + x.reduce(sum)} console.log( 1..sum(2), [1,2,3].sum([3,4,5]) ) //>>>> 3 18 |
Цитата:
Псевдокод: x = createObject({ a: 1, b: 2 }); x.a; // вызывается геттер x.a = 22; // вызывается сеттер delete x.a; // что нужно сделать, чтоб отловить это? Можно после вызова геттера запускать таймаут и проверять свойство оператором in или методом hasOwnProperty, но это сильно повлияет на производительность + код не будет последовательным. Я понимаю, что внутренних механизмов для этого не предусмотрено, просто надеюсь на остроумие здешних завсегдатаев. |
FINoM,
Если код ваш, оберните delete в функцию типа var myDelete = function (object, keyToDelete) { delete object[keyToDelete]; alert('delete event'); } myDelete(x, 'a'); Ну а если так сделать по каким-либо причинам нельзя, то возможно стоит что-то сделать чтобы это событие было не нужно? Честно говоря, я не самый опытный, но у меня иногда были необходимости в таких вещах и каждый раз это решалось сменой подхода к решению задачи. Необходимость просто отпадала. Может если вы опишете задачу чуть глобальнее, то кто-то подскажет другое решение? |
Часовой пояс GMT +3, время: 06:05. |