On Mar 24, 2012, at 5:54 PM, Allen Wirfs-Brock wrote: > I primarily favor sticking with "constructor" because the > safety/maximally-miminal proposal is all about being conservative...
I think you'll find what I'm saying is as conservative as what you've been advocating. Your reply demonstrates that we've been talking past each other. >> a) spell it "new" -- ergonomics trumps corner cases; hard cases make bad >> law > deviates from chapters 13 and 15. > > (class () {}) isn't interchangeable with (function () {}). Shouldn't it be? When I say "spell it 'new'" I mean "the *surface syntax* is spelled 'new'". That has nothing to do with the semantics. The semantics is described in point b). Keep reading... >> b) desugar it to the constructor function and the p.constructor property >> only > > but presumably means that an instance method named new can't be defined using > a class definition. Not with the declarative syntax, no. But easily enough imperatively: class C { new(x) { this.x = x } } // defines C.prototype.constructor === C C.prototype.new = function() { console.log("I am C's 'new' method") } Notice the comment: the class definition uses 'new' for the surface syntax, but that defines C.prototype.constructor, *not* C.prototype.new. If you want to add a prototype method called 'new', you can do that imperatively, the same old way as ever in JS. > Or, perhaps only if "new" is explicitly string quoted as a property name. > "new" is not a totally unreasonable method name. Also presumably means that > defining an instance method named constructor is disallowed. That's true, "new" is not an unreasonable method name. It's still a rare method name. Syntax is about optimizing for common cases. With my proposed syntax, you don't have a declarative way to create a prototype method called "new" but you still have an imperative way to do it, the same old way as before. >> c) i.e., don't create a p.new property -- no more prototype pollution >> please > > I presume you mean it also doesn't define a p.constructor property. This has > similar problems to a). No, no, see b) -- it *does* define a p.constructor property! What I've been trying to explain is that we can use "new" for the *surface syntax* but desugar it just the same as the "constructor" version: the constructor becomes both the value of the class and the p.constructor property. > It deviates from the legacy ES "class model" It implements *exactly* the legacy ES class model. > Also, most instance inherit from Object.prototype so they will still have an > inherited "constructor" property whose value is Object. They will not, because p.constructor is the constructor. > A very common idiom is to query the "class" of an object. Just look how > frequently you see could like p.class in Java or Ruby code or( p class) in > Smalltalk code. Thew equivalent of this using ES chapter 13/`5 objects is > p.constructor. Which would you prefer to see in future ES code > p.constructor===q.constructor or p.new===q.new My proposal is not, and has never been, to change the C.prototype.constructor idiom. It is to choose a different surface syntax that desugars to *exactly* the classic idiom. Dave _______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss