How can I define a default getter and setter using ECMAScript 5?

前端 未结 6 796
忘了有多久
忘了有多久 2020-12-07 01:14

How can I specify a default getter for a prototype? With default getter I mean a function that is called if obj.undefinedProperty123 is called.

I tried

相关标签:
6条回答
  • 2020-12-07 01:27

    I am not sure about what you are asking. But If you want a method to be called when the user attempts to Access object.nonExistingProperty . I dont think there is any way to do that.

    0 讨论(0)
  • 2020-12-07 01:28

    Firefox it's possible with non-standard noSuchMethod:-

    ({__noSuchMethod__:function(){alert(1);}}).a();
    
    0 讨论(0)
  • 2020-12-07 01:37

    In ECMAScript 5, you can only intercept get/set operations on specific named properties (not universally all properties) via Object.defineProperty:

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

    Here, the get function will run any time code tries to read someObj.someProp.

    In the upcoming ECMAScript 6 draft, this will be possible via proxies. A proxy has an underlying target object and set/get functions. Any time a set or get operation happens on any of a proxy's properties, the appropriate function runs, taking as arguments the proxy's target object, property name used, and the value used in a set attempt.

    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);
    

    Here, setting to getting property values on prox will cause the set/get functions to run.

    0 讨论(0)
  • 2020-12-07 01:44

    You need to wait for the implementation of the ECMA6 "Proxy" system, designed to do exactly this. See http://wiki.ecmascript.org/doku.php?id=harmony:direct_proxies.

    0 讨论(0)
  • 2020-12-07 01:49

    What Gareth said, except it's __noSuchMethod__.

    Or maybe you were thinking of PHP?

    Here's a very good article on the recently standardized property getters/setters, highlighting some previous non-standard incarnations.

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

    summary: there's no standard 'catch-all' getter / setter (yet), but Object.defineProperty is the future.

    0 讨论(0)
  • 2020-12-07 01:50

    You want to create a 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"];
    
    0 讨论(0)
提交回复
热议问题