On Apr 16, 2010, at 7:18 AM, Asen Bozhilov wrote:
2010/4/16, Dmitry A. Soshnikov <[email protected]>:
By the way, it is also petty that there's no ability to change
prototype
and there is only "get" function for that; __proto__ extension in
this
case was better.
Especially when I want to change only [[Prototype]] and keep values of
other internal properties and methods for that object.
Sorry, I missed this in Dmitry's post (skimmed while traveling), but
settable __proto__, apart from the object initialiser use case (i.e.,
on a new object not yet reachable, analogous to ES5's Object.create),
is a terrible idea.
I write this having designed and implemented settable __proto__ over
12 years ago. At the time, unstratified metaprogramming APIs were
popular; if it was good enough for Python, why not for JS. But the
lack of stratification is a problem (consider JSON data with a key
"__proto__"). And worse, the mutability means implementations must
check for cyclic prototype chains in order to avoid ilooping.
Mutable __proto__ also makes optimization harder, or simply defeats
optimizations at the price of some complexity in the engine.
Finally, mutating __proto__ on an existing object may break non-
generic methods in the new prototype object, which cannot possibly
work on the receiver (direct) object whose __proto__ is being set.
This is simply bad practice, a form of intentional type confusion, in
general.
If specific cases wouldn't care because prototype-based methods are
generic, setting __proto__ on an already-initialized object still
smells like bad form, although I admit a Self-ish programmer would
want it and probably use it well. But JS is not Self.
And I have a question. Why ES5 give control on values of internal
attributes? What will improve that? "Save" augmentation of built-in?
(You probably mean "Safe" here.)
Good design of JS libraries?
All of these, but mostly to enable higher-integrity abstractions,
including ones that mimic the built-in objects (including the DOM --
more generally, all the notorious "host objects"; see also http://wiki.ecmascript.org/doku.php?id=harmony:proxies)
.
We do not want the built-in objects to have all the power, including
to make properties non-enumerable and non-configurable but writable
(more on const below). The JS authors should have this power too, so
the committee is not a bottleneck for innovation where such attribute
control is necessary for integrity, emulation, or some other valid
reason.
Instead of that I want just naming convention improvements + `const`
keyword as Mozilla implement.
Mozilla's 'const' does not allow you to make non-writable, non-
configurable (without which, non-writable has zero integrity)
properties of objects you create.
Mozilla's 'const' has other issues, but these will be fixed in
Harmony. See http://wiki.ecmascript.org/doku.php?id=strawman:obj_initialiser_const
for more on Harmony ideas for 'const' as property initialiser keyword.
So a future 'const' can help, but it does not give enough control for
emulations and other use-cases that need to control the enumerable
attribute as well as writable and configurable.
Then there is the object-level [[Extensible]] internal property,
which 'const' does not cover in a general way in any Harmony proposal
I have seen. One special form:
const foo() { ... }
would create a block-scoped non-writable binding, initialized by
hoisting to the top of the block, whose value is the frozen function
foo. This seems good, if a bit "DWIM" in doing several things at once.
For example:
myObj.CONSTANT = 3.14;
And I expect property `CONSTANT` to have internat attributes
{DontDelete), {ReadOnly}. But I forgot, Crockford suggest upper case
only for global variables.
We're not able to introduce an uppercase-means-constant semantic rule
at this point, it's too incompatible.
Conventions are just that, and without ES5's metaprogramming API they
are advisory only -- again no integrity guarantees.
If they was added new loop, misconseptions of JS library authors will
be gone away. For example if there is:
for own(var i in obj) {
//do something with next own property
}
Not a bad idea! We've talked about it a bit in context of ECMA-357's
popular (and separable from "E4X") "for each (var i in obj) ..." loop.
But it did not fit in ES5 with its "no new syntax not supported by 3
of 4 browsers" guideline.
And my last question is. Why do you change terminology in ES5? What
was wrong with ES3 terminology?
Allen can field this one.
I will note that there are some real improvements in ES5, in
particular to Chapter 10 which now uses declarative binding
environments. ES1-3's abuse of objects for scopes (again I'm to blame
for doing so in JS in1995, economizing on objects needed to implement
the language in a big hurry) was a bug, not a feature.
/be
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss