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