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