繁体   English   中英

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

[英]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 的非常好的文章,重点介绍了一些以前的非标准化身。

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 是未来。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM