On Mar 13, 2009, at 00:27 , Brendan Eich wrote:

So a string-valued property, e.g. f.constructor.name === "Function" for function f(){}, d.constructor.name === "Date" for (d = new Date), etc.?

Yes. That would also help solve cross-frame issues for which instanceof Foo and constructor === Foo are useless.

Works for me, already implemented in SpiderMonkey. Note constructor being writable and configurable as I mentioned in reply to Tucker just now. If we want to avoid that hazard, we would need a separate, optionally locked-down method, say Object.getClassName(o).

Right, that makes sense.

Current behaviour in Firebug:

>>> function Parent() {}
>>> var parent = new Parent();
>>> parent.constructor;
Parent()
>>> Object.prototype.toString.call(parent);
"[object Object]"

>>> function Child() {}
>>> Child.prototype = new Parent();
>>> var child = new Child();
>>> child.constructor;
Parent()
>>> Object.prototype.toString.call(child);
"[object Object]"

Desired behaviour:

>>> Object.prototype.toString.call(child);
"[object Child]"
>>> Object.prototype.toString.call(parent);
"[object Parent]"

And ideally:
>>> Child.name;
"Child"
>>> Parent.name;
"Parent"

A very naïve specification would boil down to modifying step 2 and inserting a step 3 inside of 13.2.2 of the 23feb09 draft:

13.2.2 [[Construct]]
When the [[Construct]] property for a Function object F is called with a possibly empty list of
arguments, the following steps are taken:
1. Let obj be a newly created native ECMAScript object.
2. if the name property of F is a string value set the [[Class]] internal property of obj to the name property of F. 3. if the name property of F is not a string value set the [[Class]] internal property of obj to "Object".
...

There's probably a lot of issues I haven't foreseen here (on top of the yet unspecified name property of functions), but it hopefully helps to clarify what I was thinking about. It also avoids touching the behaviour of the constructor property of the prototype object.

Given that spec change, I suspect Object.getClassName(o) could be desugared to Object.prototype.toString.call(object).slice(8, -1).

Best,

Tobie

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

Reply via email to