[英]How can I define a default getter and setter using ECMAScript 5?
如何为原型指定默认 getter? 对于默认的 getter,我的意思是一个函数,如果obj.undefinedProperty123
被调用,它obj.undefinedProperty123
被调用。
我试过 Object.prototype.get = function(property) {..} 但这在这种情况下没有被调用。
在 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 草案中,这将通过代理实现。 代理具有底层目标对象和设置/获取功能。 任何时候在代理的任何属性上发生设置或获取操作时,都会运行相应的函数,并将代理的目标对象、使用的属性名称和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
/ get
函数运行。
您需要等待 ECMA6“代理”系统的实施,该系统旨在实现这一点。 请参阅http://wiki.ecmascript.org/doku.php?id=harmony:direct_proxies 。
Gareth 所说的,除了它是__noSuchMethod__
。
或者,也许您正在考虑 PHP?
这是一篇关于最近标准化的属性 getter/setter 的非常好的文章,重点介绍了一些以前的非标准化身。
总结:目前还没有标准的“全能”getter/setter,但 Object.defineProperty 是未来。
Firefox 可以使用非标准 noSuchMethod:-
({__noSuchMethod__:function(){alert(1);}}).a();
你想创建一个代理:
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"];
我不确定你在问什么。 但是,如果您希望在用户尝试访问object.nonExistingProperty
时调用方法。 我不认为有任何方法可以做到这一点。
也许迟到了,让我们添加简单的 ES5 友好的“类创建”:字符串 props 和 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;}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.