Object.assign and __proto__ property

Allen Wirfs-Brock allen at wirfs-brock.com
Sat Oct 19 09:57:14 PDT 2013

On Oct 19, 2013, at 7:55 AM, Rick Waldron wrote:

> On Sat, Oct 19, 2013 at 10:25 AM, teramako <teramako at gmail.com> wrote:
> Hi
> I believe Object.assign never update the target's [[prototype]]. But current rev19 spec is using Put. So I'm afraid of following case will update the [[prototype]].
> var soruce = {};
> Object.defineProperty(source, "__proto__", {
>     value: { a: "A", b: "B" },
>     enumerable: true
> });
> var target = {};
> Object.assign(target, source);
> Is this expected result ? and is there a plan to change to DefinePropertyOrThrow from Put ?
> Object.assign is essentially a "batch property assignment with Put"; I believe what you're describing above is Object.mixin, which is "batch property definition with DefinePropertyOrThrow".

Actually, this is a good point.  As currently specified Object.assign of with an own __proto__ property on the RHS object will trigger a [[SetPrototypeOf]] on the LHS object.  Is that what we want.  It is a direct fallout of specifying Object.assign as the equivalent of a sequence of property assignments from the RHS to the LHS.   "__proto__" could be special cased.  But should it?

Object.mixin doesn't have this issue because, as Rick points out, it uses GetOwnProperty/DefineProperty instead of Get/Set.

Anybody want to argue that Object.assign shouldn't trigger [[SetPrototypeOf]]?


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20131019/395a3aba/attachment-0001.html>

More information about the es-discuss mailing list