如何为原型指定默认的getter?
对于默认的getter,我的意思是在调用obj.undefinedProperty123
时调用的函数。
我尝试了Object.prototype.get = function(property){..}但在这种情况下不会调用它。
答案 0 :(得分:8)
在ECMAScript 5中,您只能通过Object.defineProperty
拦截特定命名属性(通常不是所有属性)的get / set操作:
Object.defineProperty(someObj, "someProp", {
get: function() {
console.log("you tried to get someObj.someProp");
return "foo";
}
});
此处,只要代码尝试阅读get
,someObj.someProp
函数就会运行。
在即将发布的ECMAScript 6草案中,可以通过proxies进行。代理具有底层目标对象和set / get函数。只要在任何代理的属性上发生set或get操作,就会运行相应的函数,将代理的目标对象,使用的属性名称和{{1}中使用的值作为参数。尝试。
set
此处,设置为var proxyHandler = {
get: function(obj, name){
console.log("you're getting property " + name);
return target[name];
},
set: function(obj, name, value) {
console.log("you're setting property " + name);
target[name] = value;
}
}
var underlyingObj = {};
// use prox instead of underlyingObj to use get/set interceptor functions
var prox = new Proxy(underlyingObj, proxyHandler);
上的属性值将导致prox
/ set
函数运行。
答案 1 :(得分:4)
Gareth说的是什么,除了__noSuchMethod__
。
或许你在想PHP?
这是一篇关于最近标准化的属性getter / setter的非常好的文章,突出了之前的一些非标准化身。
总结:没有标准的'全能'getter / setter(还),但Object.defineProperty是未来。
答案 2 :(得分:3)
您需要等待ECMA6“代理”系统的实施,该系统旨在实现此目的。请参阅http://wiki.ecmascript.org/doku.php?id=harmony:direct_proxies。
答案 3 :(得分:2)
Firefox可以使用非标准的noSuchMethod: -
({__noSuchMethod__:function(){alert(1);}}).a();
答案 4 :(得分:0)
我不确定你在问什么。但是,如果您希望在用户尝试访问object.nonExistingProperty
时调用方法。我认为没有办法做到这一点。
答案 5 :(得分:0)
您要创建一个Proxy:
const data = {};
const proxy = new Proxy(data, {
get: (target, prop) => {
console.log({ target, prop });
return "My Value";
},
set: (target, prop, value) => {
console.log({ target, prop, value });
return true;
},
});
proxy["foo"] = "bar";
const bar = proxy["foo"];
答案 6 :(得分:0)
也许迟到了,让我们添加简单的 ES5 友好的“类创建”:字符串道具和 getter - 我需要它进行一些古老的重写,以暂时支持 IE(是的,这很痛苦,仍然发现有人依赖 ActiveX )
var MyObj = function () {
var obj = {
url: 'aabbcc',
a: function(){ return this.url;}
}
Object.defineProperty(obj, "urltoo", { get: function () { return this.url; } })
return obj;
}
var X = new MyObj();
x.url // aabbcc
x.urltoo // aabbcc
x.urltoo() // error - not a function
x.a() // aabbcc
x.a // ƒ (){ return this.url;}