On Apr 16, 2010, at 1:11 PM, Erik Arvidsson wrote:

On Fri, Apr 16, 2010 at 09:06, Brendan Eich <[email protected]> wrote: ... 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.

[snip]


Unfortunately there are use case (although limited) that cannot be solved without a mutable __proto__. Extending built *classes* is one such use case.

function HelloElement() {
  var el = document.createElement('div');
  el.__proto__ = HelloElement.prototype;
  el.text = 'Hello';
  return el;
}
HelloElement.prototype = {
  __proto__: HTMLDivElement.prototype,
  set text(text) { this.textContent = text; },
  say: function() {
    alert('Hello');
  }
};

document.body.appendChild(new HelloElement).say();

Does this work cross-browser? Gecko's DOM puts methods and WebIDL attributes (getters/setters) on the prototype, which you chain to. What happens if you access a standard HTMLDivElement method or getter on (new HelloElement)?

Anyway, the Self-ish use case does arise in practice. It is not something standard JS has ever catered to. I don't see us standardizing mutable __proto__, or even read-only __proto__. We should dig into this HelloElement case more before going further with mutable __proto__, I think.


When we have this code sample I'd like to also point out that using __proto__ in an object literal is much more user friendly and more efficient than using Object.create which is design for meta programming and not for users.

Object.create is the standardized form of Crock's beget. It's not bad for an API, albeit longer than b-e-g-e-t (but also less likely to collide, although collide it did with TIBET's create method on Object).


Compare the following two:

var obj = Object.create(myPrototype, getOwnProperties({
  ...
}));

and:

var obj = {
  __proto_: myPrototype,
  ...
};

It is pretty clear that Object.create was never designed for ordinary, everyday use.

Yes, I allowed for that as cited up top in this message -- __proto__ in an object initialiser is more usable, and it is useful (modulo syntax and stratification lack). Note how the object being initialised cannot yet be referenced, so no cycle detection is needed.

To stratify in some sense, or at least avoid name collisions, we would need a new name for the property. The names proposal again comes to mind: the implementation could create and expose a well-known Name instance meaning what __proto__ means now.

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

Reply via email to