是否可以捕获何时访问对象的(任何)属性,或尝试访问?
例:
我已经创建了自定义对象Foo
- var Foo = (function(){
- var self = {};
- //... set a few properties
- return self;
- })();
然后有一些针对Foo的动作 – 有人试图访问属性栏
- Foo.bar
有没有办法(原型,也许)来捕捉这个?酒吧可能在Foo上未定义.捕获任何尝试访问未定义的属性即可.
例如,如果bar在Foo上未定义,并且尝试使用Foo.bar,则会像:
- Foo.prototype.undefined = function(){
- var name = this.name; //name of property they attempted to access (bar)
- Foo[name] = function(){
- //...do something
- };
- return Foo[name];
- }
但功能,不像我的例子.
概念
- Foo.* = function(){
- }
背景
如果我有一个自定义功能,我可以每次调用此函数时收听(见下文).只是想知道是否可以通过财产访问.
- Foo = function(){};
- Foo.prototype.call = function(thisArg){
- console.log(this,thisArg);
- return this;
- }
解决方法
这将是可能的ECMAScript6,现在可以在Firefox,使用新的
proxy stuff.直到那时,不,我恐怕没有办法挂钩链.
花了我一段时间,但是我终于找到了my previous answer这个问题.查看代理的所有细节的答案等等.
这是答案的代理示例:
- var obj = new Proxy({},{
- get: function(target,name) {
- if (!(name in target)) {
- console.log("Getting non-existant property '" + name + "'");
- return undefined;
- }
- return target[name];
- },set: function(target,name,value) {
- if (!(name in target)) {
- console.log("Setting non-existant property '" + name + "',initial value: " + value);
- }
- target[name] = value;
- }
- });
- console.log("[before] obj.foo = " + obj.foo);
- obj.foo = "bar";
- console.log("[after] obj.foo = " + obj.foo);
Live Copy(目前仅适用于Firefox)| Source
运行时输出:
- Getting non-existant property 'foo'
- [before] obj.foo = undefined
- Setting non-existant property 'foo',initial value: bar
- [after] obj.foo = bar