Javascript 为什么';t将手表的垫片()拆下,并在https://gist.github.com/384583 在幻影中工作?

Javascript 为什么';t将手表的垫片()拆下,并在https://gist.github.com/384583 在幻影中工作?,javascript,phantomjs,Javascript,Phantomjs,我正在做一些服务器端javascript,基本上需要访问网站的完整DOM和跨域打开网站的能力,至少到目前为止,PhantomJS似乎是完成这项工作的最佳工具 但是,它缺少一个Object.watch()方法,我更愿意使用它。因此,我试图使用Stackoverflow上其他地方作为答案发布的垫片(可在此处找到:)来访问这些方法 它不起作用了 这也远远超出了我对JavaScript的理解水平——因此我想知道是否有人能帮助我准确地理解它在做什么,以及为什么它可能不起作用 谢谢你的帮助 托比 (以下引用

我正在做一些服务器端javascript,基本上需要访问网站的完整DOM和跨域打开网站的能力,至少到目前为止,PhantomJS似乎是完成这项工作的最佳工具

但是,它缺少一个Object.watch()方法,我更愿意使用它。因此,我试图使用Stackoverflow上其他地方作为答案发布的垫片(可在此处找到:)来访问这些方法

它不起作用了

这也远远超出了我对JavaScript的理解水平——因此我想知道是否有人能帮助我准确地理解它在做什么,以及为什么它可能不起作用

谢谢你的帮助

托比

(以下引用代码:

// Cross-browser object.watch and object.unwatch

// 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,
                    enumerable: true,
                    configurable: true
                });
            } 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;
    };
}
和我的测试代码:

tO = {
    "v":0,
    "vplus":function(){this.v ++}
};
tO.watch("v", function(prop, oldval, newval) {
    console.log("The property "+prop+" is now "+tO.v+". Newval is "+newval+" and oldval     "+oldval+".");
    if (newval == 5){phantom.exit()};
});
tO.v = 1;
var i = 0
for(i=0; i<10; i++) {
    tO.v = i; 
    console.log(tO.v);
    if(tO.v == 9){
        console.log("got to 9");
    };
};
tO={
“v”:0,
“vplus”:函数(){this.v++}
};
tO.watch(“v”,功能(道具、旧值、新值){
log(“属性“+prop+”现在是“+tO.v+”。Newval是“+Newval+”和oldval“+oldval+”);
如果(newval==5){phantom.exit()};
});
tO.v=1;
变量i=0

对于(i=0;i来回答我自己的问题:提供的垫片似乎放置了一个损坏的setter函数。特别是,除非handler函数返回有意义的内容(很可能没有),否则属性将设置为undefined。替换

return newval = handler.call(this, prop, oldval, val);

他似乎完成了任务

作为旁注,这个特殊的垫片很巧妙,但有几个限制:

  • 依赖监视值的代码可能需要一段时间才能工作,因此,如果将监视值用作标志,则在关键操作之后更改监视值是一件好事

  • 不能向一个值添加多个处理程序

var newval = handler.call(this, prop, oldval, val) || val;
return newval;