Quick note: that isConstructor isn't really viable unless you plan on using
it with constructors that do not have side effects.
Rick
The Proxy-based solution needs to be used in these cases. Now we just
need to wait until Proxies are available everywhere! ;-)
On Wed, Jun 11, 2014 at 10:58 AM, Rick Waldron <waldron.rick at gmail.com
<https://mail.mozilla.org/listinfo/es-discuss>>
wrote:
>/
/>/
/>/
/>/ On Wed, Jun 11, 2014 at 10:24 AM, Domenic Denicola <
/>/ domenic at domenicdenicola.com
<https://mail.mozilla.org/listinfo/es-discuss>> wrote:
/>/
/>>/ A variety of places in the spec use the new IsConstructor abstract
/>>/ operation. In ES5, this test (essentially, "does the object implement the
/>>/ [[Construct]] internal method") was restricted to the `new` operator. But
/>>/ in ES6, it is used in implementing a large variety of built-in functions:
/>>/
/>>/ - All Array methods
/>>/ - All %TypedArray% methods
/>>/ - All Promise methods (via NewPromiseCapability)
/>>/
/>>/ (Note that there are two uses: arrays and typed arrays do alternative
/>>/ logic for non-constructors; promises fail immediately. This inconsistency
/>>/ might be a bug?)
/>>/
/>>/ It seems to me that we should expose this primitive reflective operation
/>>/ to users, instead of having all of these methods be able to detect
/>>/ something that user code can't, and thus making them harder to explain or
/>>/ polyfill.
/>/
/>/
/>>/ Alternately, if we don't think users should be doing this kind of
/>>/ reflection, then we probably shouldn't be doing it ourselves. In which
/>>/ case, figuring out an alternate path for the above methods would be
/>>/ useful---perhaps they simply try to construct, and fail immediately if
used
/>>/ with a non-constructible object, instead of falling back.
/>>/
/>/
/>/ I had similar questions a couple years ago and Allen advised that the
/>/ easiest polyfill for such a mechanism is:
/>/
/>/ function isConstructor(C) {
/>/ try {
/>/ new C();
/>/ return true;
/>/ } catch (e) {
/>/ return false;
/>/ }
/>/ }
/>/
/>/
/>/ Additionally, at the July 2012 tc39 meeting I proposed (over breakfast) an
/>/ ES7 "standard library module" that exported the abstract operations that
/>/ are now defined in chapter 7
/>/ http://people.mozilla.org/~jorendorff/es6-draft.html#sec-abstract-operations,
<http://people.mozilla.org/%7Ejorendorff/es6-draft.html#sec-abstract-operations,>
/>/ the response was positive but it was far too early to have a serious
/>/ discussion. Anyway, with that you'd just write:
/>/
/>/ import { isConstructor } from "es-abstract";
/>/
/>/
/>/ Rick
/>/
/>
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss