Calling toString on function proxy throws TypeError exception
Claude Pache
claude.pache at gmail.com
Tue Oct 27 14:04:50 UTC 2015
> Le 27 oct. 2015 à 14:14, Boris Zbarsky <bzbarsky at mit.edu> a écrit :
>
> On 10/27/15 4:35 AM, Claude Pache wrote:
>> it is that, for any callable object, it will return a string and not throw, because it was so since the dawn of JS.
>
> It's totally false for random "host objects" with a [[Call]] in ES5, per spec and in at least some implementations. As you can tell in Firefox for example:
>
> Function.prototype.toString.call(document.createElement("object"))
>
> (though it does not throw for document.all in Firefox, for interesting implementation reasons).
>
>> That function will work (in the sense of: will return an answer; I'm not judging the quality of that answer) with anything reasonable fed to it (where "reasonable" excludes things like `(class { static toString() { throw "pwnd!" }})`).
>
> Won't work with an HTMLObjectElement in at least some browsers. How "reasonable" that is, who knows.
>
> -Boris
You're right. But since `document.createElement("object")` does not inherit from `Function.prototype`, the code (`f.toString()`) accidentally works after all.
(I've tried not to be too smart in my example by writing `f.toString()` instead of `Function.prototype.toString.call(f)`. Maybe I should have been even less smart by defining an instance method on `Function.prototype` instead of a static method on `Function`...)
—Claude
More information about the es-discuss
mailing list