Skip to content

Wrapping constructors in a Proxy breaks toString #1068

Open
@chancancode

Description

@chancancode

Bug Report

A while back, I filed https://issues.chromium.org/issues/380105420 for a completely unrelated issue in a different context.

Today, I came across open-telemetry/opentelemetry-js#4473 (vercel/otel#136) which sounds suspiciously similar. Did some digging, and indeed, edge does wrap the constructor in a proxy.

The TL;DR of the issue is that, currently in V8, wrapping a native function in a Proxy alters the result of toString():

Object.toString();                       // => "function Object() { [native code] }"
p = new Proxy(Object, {}); p.toString(); // => "function () { [native code] }"

IMO, this is a bug in V8, and would appreciate someone representing a different use case chiming in on that issue.

Anyway, this ends up mattering because some code, in this case, lodash's isPlainObject() uses the exact match of the string as a signal and that ends up breaking.

From what I gathered, the whole reason the Proxying code exists is an imperfect workaround to make more existing code work as-is, to that end, you may want to also handle toString() to improve compatibility on the proxies until V8 fixes the underlying bug.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions