请务必阅读以下所有评论.不推荐使用Object.Watch和Object.Observe.请参阅Elliot B对更新(截至2018年6月)方法的评论.
我一直在寻找一种简单的方法来监控对象或变量的变化,我发现Object.Watch,Mozilla浏览器支持这种方式,但IE不支持.所以我开始四处寻找,看是否有人写过某种等价物.
关于我发现的唯一一件事是jQuery插件,但我不确定这是不是最好的方法.我当然在大多数项目中都使用jQuery,所以我并不担心jQuery方面......
无论如何,问题是:有人能告诉我一个jQuery插件的工作示例吗?我有问题让它工作......
或者,是否有人知道任何可以跨浏览器工作的更好的替代品?
答案后更新:
谢谢大家的回复!我试过这里发布的代码:http: //webreflection.blogspot.com/2009/01/internet-explorer-object-watch.html
但我似乎无法使其与IE一起工作.下面的代码在Firefox中运行良好,但在IE中没有任何作用.在Firefox中,每次Object.Observe更改Object.watch()时watcher.status都会调用in ,您可以在页面上看到输出.在IE中,这不会发生,但我可以看到document.write()更新值,因为最后一次watcher.watch()调用显示正确的值(在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>");
Run Code Online (Sandbox Code Playgroud) 列出网站使用的所有全局变量的方法是什么?任何浏览器javascript调试器都可以这样做吗?使用我的意思是READ,没有改变/添加.检测iframe,也会很好.
请注意:我需要获取网站"触及"的全局变量列表.并非所有这些或已添加的或已编辑的,在站点脚本中的任何位置使用的那些.
长话短说:我的情况是我喜欢PHP式的getter,但是在JavaScript中.
我的JavaScript只在Firefox中运行,因此我可以使用Mozilla特定的JS.
我可以找到制作JS getter的唯一方法是需要指定它的名称,但是我想为所有可能的名称定义一个getter .我不确定这是否可行,但我非常想知道.
通过javascript文档,我发现javascript对象上的以下两个函数看起来很有趣:
.watch - 为属性分配值并在发生时运行函数.
.unwatch - 使用watch方法删除观察点集.
样品用法:
o = { p: 1 };
o.watch("p", function (id,oldval,newval) {
console.log("o." + id + " changed from " + oldval + " to " + newval)
return newval;
});
Run Code Online (Sandbox Code Playgroud)
每当我们更改"p"的属性值时,此函数都会被触发.
o.p = 2; //logs: "o.p changed from 1 to 2"
Run Code Online (Sandbox Code Playgroud)
我在过去的几年里一直在使用javascript,从未使用过这些函数.
有人可以抛出一些好的用例,这些功能会派上用场吗?
这是我的用例
getSomeFields(persons, fields){
let personsWithSpecificFields = [];
_.each(persons, (person) => {
let personSpecificFields = {};
_.each(fields, (field) => {
// here im thinking to modify the field to match the method name
// ( if something like __call as in php is available)
// e.g. field is first_name and i want to change it to getFirstName
personSpecificFields[field] = person[field]();
});
personsWithSpecificFields.push(personSpecificFields);
});
return personsWithSpecificFields;
}
Run Code Online (Sandbox Code Playgroud)
这是我的 person class
import _ from 'lodash';
export default class Person{
// not working..
__noSuchMethod__(funcName, …Run Code Online (Sandbox Code Playgroud) 我想知道是否有一种方法可以模仿 Node.js 中 PHP 的神奇方法 __get() 和 __set()。从这个问题:JavaScript getter for allproperty我知道你可以在Rhino中做到这一点,但Node是建立在V8之上的。V8有办法做到这一点吗?
可以在javascript中创建getter和setter,如下所示
Object.defineProperty
__define***__
Run Code Online (Sandbox Code Playgroud)
在所有这些实例中,属性的名称是已知的.
是否有可能创建一个通用的.
我的意思是,我有一个getter和/或setter,无论属性名称如何都会被调用.
这可能吗?如果是这样,怎么样?
问候.
注意:我在发布问题后找到了这些.看起来目前不可能作为第一个答案说明.
javascript ×8
dom-events ×2
jquery ×2
node.js ×2
browser ×1
ecmascript-6 ×1
firefox ×1
getter ×1
json ×1
php ×1
v8 ×1