观察 JavaScript 中的对象属性变化

IT技术 javascript object cross-browser properties watch
2021-02-05 12:38:29

可能的重复:
所有浏览器的 Javascript Object.Watch?

我刚刚阅读了 Mozilla 的watch() 方法文档它看起来非常有用。

但是,我找不到 Safari 类似的东西。无论是 Internet Explorer。

您如何管理跨浏览器的可移植性?

3个回答

不久前,我为此创建了一个小的object.watch 垫片它适用于 IE8、Safari、Chrome、Firefox、Opera 等。

/*
* object.watch v0.0.1: Cross-browser object.watch
*
* By Elijah Grey, http://eligrey.com
*
* A shim that partially implements object.watch and object.unwatch
* in browsers that have accessor support.
*
* Public Domain.
* NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
*/

// object.watch
if (!Object.prototype.watch)
    Object.prototype.watch = function (prop, handler) {
        var oldval = this[prop], newval = oldval,
        getter = function () {
            return newval;
        },
        setter = function (val) {
            oldval = newval;
            return newval = handler.call(this, prop, oldval, val);
        };
        if (delete this[prop]) { // can't watch constants
            if (Object.defineProperty) // ECMAScript 5
                Object.defineProperty(this, prop, {
                    get: getter,
                    set: setter
                });
            else if (Object.prototype.__defineGetter__ && Object.prototype.__defineSetter__) { // legacy
                Object.prototype.__defineGetter__.call(this, prop, getter);
                Object.prototype.__defineSetter__.call(this, prop, setter);
            }
        }
    };

// object.unwatch
if (!Object.prototype.unwatch)
    Object.prototype.unwatch = function (prop) {
        var val = this[prop];
        delete this[prop]; // remove accessors
        this[prop] = val;
    };
它真的适用于非 DOM 对象的 IE8 吗?
2021-03-23 12:38:29
这在某些 DOM 属性的 Safari 中不起作用,例如 el.style.width
2021-03-27 12:38:29
关于你为什么从 Github 中删除它的任何原因?更好的解决方案?没有工作吗?IE7怎么样?
2021-04-04 12:38:29
它仍在 Github 上,我只是将其移至要点 ( gist.github.com/384583 ),因为它对于 repo imo 而言并不够重要。
2021-04-06 12:38:29
我们如何使用它来监视 DOM 对象上的 innerHTML?
2021-04-09 12:38:29

不幸的是,这不是一个可移植的解决方案。据我所知,IE 没有这样的东西,尽管如果有的话会很棒

您可以通过覆盖方法和变量来实现自己的通知系统。我不认为它那么重要,但我不知道你打算用这样的系统做什么。