Object.watch () для всех браузеров? - PullRequest
115 голосов
/ 23 июня 2009

Обратите внимание, что Object.Watch и Object.Observe оба устарели (по состоянию на июнь 2018 года).


Я искал простой способ отслеживать объект или переменную на предмет изменений и обнаружил Object.watch(), который поддерживается в браузерах Mozilla, но не в IE. Поэтому я начал искать, чтобы увидеть, если кто-то написал какой-то эквивалент.

Единственное, что я обнаружил, это плагин jQuery , но я не уверен, что это лучший путь. Я, конечно, использую jQuery в большинстве своих проектов, поэтому меня не беспокоит аспект jQuery ...

В любом случае, вопрос: может кто-нибудь показать мне рабочий пример этого плагина jQuery? У меня проблемы с этим ...

Или кто-нибудь знает какие-нибудь лучшие альтернативы, которые могли бы работать в кросс-браузерном режиме?

Обновление после ответов :

Спасибо всем за ответы! Я опробовал код, размещенный здесь: http://webreflection.blogspot.com/2009/01/internet-explorer-object-watch.html

Но я не мог заставить его работать с IE. Приведенный ниже код отлично работает в Firefox, но ничего не делает в IE. В Firefox каждый раз, когда изменяется watcher.status, вызывается document.write() в watcher.watch(), и вы можете увидеть результат на странице. В IE этого не происходит, но я вижу, что watcher.status обновляет значение, потому что последний вызов document.write() показывает правильное значение (как в IE, так и в FF). Но если функция обратного вызова не вызывается, то это бессмысленно ...:)

Я что-то упустил?

var options = {'status': 'no status'},
watcher = createWatcher(options);

watcher.watch("status", function(prop, oldValue, newValue) {
  document.write("old: " + oldValue + ", new: " + newValue + "<br>");
  return newValue;
});

watcher.status = 'asdf';
watcher.status = '1234';

document.write(watcher.status + "<br>");

Ответы [ 7 ]

113 голосов
/ 13 августа 2009

(Извините за перекрестную публикацию, но этот ответ, который я дал на подобный вопрос, прекрасно работает здесь)

Я создал небольшой object.watch shim для этого некоторое время назад,Работает в IE8, Safari, Chrome, Firefox, Opera и т. Д.

19 голосов
/ 23 июня 2009

Этот плагин просто использует таймер / интервал, чтобы многократно проверять изменения объекта. Может быть, достаточно хорошо, но лично я хотел бы больше непосредственности в качестве наблюдателя.

Вот попытка довести watch / unwatch до IE: http://webreflection.blogspot.com/2009/01/internet-explorer-object-watch.html.

Это меняет синтаксис по сравнению с Firefox, добавляя наблюдателей. Вместо:

var obj = {foo:'bar'};
obj.watch('foo', fooChanged);

Вы делаете:

var obj = {foo:'bar'};
var watcher = createWatcher(obj);
watcher.watch('foo', fooChanged);

Не так приятно, но как наблюдатель вы сразу получаете уведомление.

11 голосов
/ 27 июня 2013

Текущий ответ

Используйте новый объект Proxy , который может отслеживать изменения в своей цели.

let validator = {
    set: function(obj, prop, value) {
        if (prop === 'age') {
            if (!Number.isInteger(value)) {
                throw new TypeError('The age is not an integer');
            }
            if (value > 200) {
                throw new RangeError('The age seems invalid');
            }
        }

        // The default behavior to store the value
        obj[prop] = value;

        // Indicate success
        return true;
    }
};

let person = new Proxy({}, validator);

person.age = 100;
console.log(person.age); // 100
person.age = 'young'; // Throws an exception
person.age = 300; // Throws an exception

Старый ответ за 2015 год

Вы могли бы использовать Object.observe () из ES7 . Вот полифилл. Но Object.observe () теперь отменен . Извините, люди!

6 голосов
/ 16 июля 2014

Обратите внимание, что в Chrome 36 и выше вы также можете использовать Object.observe. На самом деле это часть будущего стандарта ECMAScript, а не специфичная для браузера функция, такая как Mozilla Object.watch.

Object.observe работает только со свойствами объекта, но намного эффективнее, чем Object.watch (что предназначено для отладки, а не для производственного использования).

var options = {};

Object.observe(options, function(changes) {
    console.log(changes);
});

options.foo = 'bar';
2 голосов
/ 20 января 2017

вы можете использовать Object.defineProperty .

смотреть недвижимость bar в foo

Object.defineProperty(foo, "bar", {
  get: function (val){
      //some code to watch the getter function
  },

  set: function (val) {
      //some code to watch the setter function
  }
})
1 голос
/ 10 декабря 2018

Я использовал Watch.js в одном из моих проектов.И он работает нормально. Одним из главных преимуществ использования этой библиотеки является:

"С Watch.JS вам не придется менять способ разработки."

Пример приведен ниже

//defining our object however we like
var ex1 = {
	attr1: "initial value of attr1",
	attr2: "initial value of attr2"
};

//defining a 'watcher' for an attribute
watch(ex1, "attr1", function(){
	alert("attr1 changed!");
});

//when changing the attribute its watcher will be invoked
ex1.attr1 = "other value";
<script src="https://cdn.jsdelivr.net/npm/melanke-watchjs@1.5.0/src/watch.min.js"></script>

Это так просто!

0 голосов
/ 14 июля 2013

Я также думаю, что сейчас лучшим решением является использование Watch.JS, здесь можно найти хороший учебник: Прослушивание / наблюдение за изменениями объектов или массивов в Javascript (событие Изменения свойств объектов Javascript)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...