如何使用ECMAScript 5定义默认的getter和setter?

时间:2010-06-24 18:20:50

标签: javascript prototype getter ecmascript-5

如何为原型指定默认的getter? 对于默认的getter,我的意思是在调用obj.undefinedProperty123时调用的函数。

我尝试了Object.prototype.get = function(property){..}但在这种情况下不会调用它。

7 个答案:

答案 0 :(得分:8)

在ECMAScript 5中,您只能通过Object.defineProperty拦截特定命名属性(通常不是所有属性)的get / set操作:

Object.defineProperty(someObj, "someProp", {
    get: function() {
        console.log("you tried to get someObj.someProp");
        return "foo";
    }
});

此处,只要代码尝试阅读getsomeObj.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的非常好的文章,突出了之前的一些非标准化身。

http://whereswalden.com/2010/04/16/more-spidermonkey-changes-ancient-esoteric-very-rarely-used-syntax-for-creating-getters-and-setters-is-being-removed/

总结:没有标准的'全能'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;}