是否可以捕获何时访问对象的(任何)属性,或尝试访问?
例:
我已经创建了自定义对象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