[WebIDL] Should stringifiers use [[Get]] and [[Call]] or call the canonical getter/function?

Right now the spec says that given this:

   [Constructor(DOMString arg)]
   interface Foo {
     stringifier DOMString myString(); // always returns the argument
                                       // passed to the constructor
   }

and this JS:

   var foo = new Foo("abc");
   alert(foo);
   Foo.prototype.myString = function() { return "xyz"; }
   alert(foo);

the two alerts will show "abc" and "xyz" respectively.  Furthermore this JS:

   var foo = new Foo("abc");
   Object.defineProperty(foo, "myString",
                         { get: function() { throw "FAIL"; } })
   alert(foo);

will throw an exception.

This seems pretty unexpected to me.  I would expect the behavior of 
toString() to not be affected by changes to the myString property of the 
object (or even the prototype); instead it seems like it should call the 
canonical myString...

Thoughts?

And in particular, the way the spec is phrased right now means that this 
bit of WebIDL from HTMLAnchorElement:

     stringifier attribute DOMString href;

does not have the same behavior as this bit would:

    attribute DOMString href;
    stringifier DOMString();

with prose defining DOMString to do the same thing as the href getter.

-Boris

Received on Friday, 5 October 2012 19:47:37 UTC