On Thu, Aug 22, 2013 at 9:22 AM, Brandon Benvie <[email protected]> wrote:
> On 8/22/2013 8:04 AM, Mark S. Miller wrote:
>
>> var Promise = (function(){
>> "use strict"; // of course
>>
>> var brand = new WeakMap();
>>
>> // only ever called with "new"
>> function HiddenPromiseConstructor(**callback) {
>> // initialize "this", which it can assume starts fresh and
>> trustworthily uninitialized
>> brand.set(this, true);
>> }
>>
>> function Promise(arg) {
>> if (Object.getPrototypeOf(this) === Promise.prototype &&
>> !(brand.has(this))) {
>> // assume likely called with "new", but do not trust
>> "this"
>> return new HiddenPromiseConstructor(arg)
>> } else {
>> // assume called for coercion behavior. Ignore this
>> if (brand.has(arg)) {
>> return arg;
>> } else {
>> return Promise.of(arg);
>> }
>> }
>> }
>> HiddenPromiseConstructor.**prototype = Promise.prototype;
>>
>> // initialize Promise.prototype
>> // initialize Promise statics
>> return Promise
>> })();
>>
>
> I'd make one small change to this:
>
>
> if (Object.getPrototypeOf(this) === Promise.prototype &&
> !(brand.has(this))) {
>
> to
>
> if (this instanceof Promise && !(brand.has(this))) {
>
> or an alternative that I think is functionally identical, if you want to
> avoid instanceof:
>
> if (Promise.prototype.**isPrototypeOf(this) && !(brand.has(this))) {
>
>
> This change would allow subclassing of Promise.
This change would mislead my example
Object.create(p, {Promise: {value: Promise}}).Promise(....)
into calling Promise's construct behavior instead of its coerce behavior.
>
>
> ______________________________**_________________
> es-discuss mailing list
> [email protected]
> https://mail.mozilla.org/**listinfo/es-discuss<https://mail.mozilla.org/listinfo/es-discuss>
>
--
Cheers,
--MarkM
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss