Hi Nicholas, sorry for the tardy reply. I did propose NoSuchProperty to Ecma TC39 today. To recap:

// Library code starts here.

const NoSuchProperty = Proxy(Object.prototype, {
  // uncomment for nasty Firefox bug workaround:
  // has: function(target, name) { return true; },
  get: function(target, name, receiver) {
    if (name in Object.prototype) {
      return Reflect.get(Object.prototype, name, receiver);
    }
    throw new TypeError(name + " is not a defined property");
  }
});

function NoSuchPropertyClass() {}
NoSuchPropertyClass.prototype = NoSuchProperty;

// End library code.
// Your client code starts here.

class MySaferClass extends NoSuchPropertyClass {
  ...
}

The library code is self-hosted based on ES6 Proxies and Reflect.

The committee reaction was to let this be put in popular libraries, in forms to be polished based on actual developer experience, and then we can standardize once there is a clear winner and strong adoption.

Hope this is survivable. I argued we should shortcut to reduce the burden on the ecosystem but (as I've argued many times) TC39 believes we are least capable compared to the wider ecosystem (github, etc.) in designing, user-testing, polishing, and finalizing APIs. We can do final polish and formal specification, for sure. Y'all should do the hard part, not because we are lazy but because you are many, closer to your problem domains and use-cases, and collectively wiser about the details.

/be

Brendan Eich wrote:
Just FTR, I'll put a ratioanlized ES7 proposal on the agenda for the July TC39 meeting, as per

https://twitter.com/BrendanEich/status/475067783282057216

Thanks to Nicholas for the suggestion!

/be

Brendan Eich wrote:
Nicholas C. Zakas wrote:
It can be done with Proxy, but that kind of sucks because I always need to go through the extra step of creating the Proxy for each object and passing around the Proxy instead. To me, this is similar to setting a property to be readonly in strict mode, except its writeonly (or rather, write-first).

What about the code I showed, which shows a singleton being spliced high on many objects' prototype chains to handle the missing property throw?

js> var NoSuchProperty = Proxy({}, {
  has: function(target, name) { return true; },
  get: function(target, name, receiver) {
    if (name in Object.prototype) {
      return Reflect.get(Object.prototype, name, receiver);
    }
    throw new TypeError(name + " is not a defined property");
  }
});
js> var obj = Object.create(NoSuchProperty)
js> obj.foo = 42
42
js> obj.foo
42
js> obj.bar
/tmp/p.js:7:4 TypeError: bar is not a defined property

You could avoid Object.create by assigning to a Constructor.prototype, or hacking with __proto__, of course.

/be
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to