Le 13 sept. 2014 à 14:19, Claude Pache <[email protected]> a écrit :

> 
> Le 13 sept. 2014 à 11:47, Claude Pache <[email protected]> a écrit :
> 
>> Hi,
>> 
>> As noted some time ago, there is an issue with `Object.defineProperty` when 
>> it happens that someone has the facetious idea to give some value to 
>> `Object.prototype.get` [1].
>> 
>> While it is hardly an issue in day-to-day programming, I think that it is a 
>> good idea to make sure that specialized API (Reflect, proxy traps) are 
>> robust by design against that bug^H^H^H feature. Concretely, I propose:
>> 
>> (1) proxy.[[DefineOwnProperty]] — When a proxy defines the corresponding 
>> trap, it shall receive an object with no prototype as property descriptor.
>> 
>> (2) Reflect.getOwnPropertyDescriptor —That method shall return an object 
>> with no prototype, so that it can be readily used elsewhere, e.g. in 
>> Reflect.defineProperty.
>> 
>> —Claude
>> 
>> [1] 
>> http://esdiscuss.org/topic/object-prototype-get-bye-bye-object-defineproperty
> 
> One can also (either alternatively or in addition) correct the other end of 
> the API: (1) in proxy.[[GetOwnProperty]], ignore non-own properties of the 
> result of the trap, and (2) in Reflect.defineProperty, ignore non-own 
> properties of the object descriptor. 
> 
> The core problem is that the two internal operations that convert between an 
> internal representation of a property descriptor on the one side, and a 
> concrete object representing a property descriptor on the other side, are not 
> the inverse one of the other, because of the interference of Object.prototype.
> 
> —Claude

Sorry for the spam, but I thought that a concrete example is good to illustrate 
the issue. Currently, under the assumption that someone will write 
`Object.prototype.get = function() {}`, the following proxy:

    Proxy(target, {
        defineProperty: (target, prop, desc) => Reflect.defineProperty(target, 
prop, desc)
      , getOwnPropertyDescriptor: (target, prop) => 
Reflect.getOwnPropertyDescriptor(target, prop)
    })

is broken, and the following code:

    desc = Reflect.getOwnPropertyDescriptor(source, prop)
    if (desc)
        status = Reflect.defineProperty(target, prop, desc)
        
is broken as well.

—Claude


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

Reply via email to