This repository has been archived by the owner on Feb 19, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 4
CS2 Discussion: Output: Super - CS vs ES6 semantics #68
Labels
Comments
Two more ES/super facts that are relevant to this decision:
So we either must call |
Instead of automatically calling |
@edemaine do you mean something like class B extends A
constructor: (@param) ->
console.log @param becoming class B extends A {
constructor (param) {
var this1
this1 = Object.create(B.prototype)
this1.param = param
console.log(this1.param)
return this1
}
} ? |
@connec Yes, except I think you need to |
Good point, updated for reference. |
Closed via jashkenas/coffeescript#4424. |
coffeescriptbot
changed the title
Super - CS vs ES6 semantics
CS2 Discussion: Output: Super - CS vs ES6 semantics
Feb 19, 2018
Migrated to jashkenas/coffeescript#4961 |
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Currently we have classes working in connec's branch pull #4354 (read the comments) - however as we go through the tests and compatibility with ES6 classes there are a lot of edge cases around super. In particular how ES6 (currently) handles super.
The basics of ES and super:
super()
needs to be called in a constructor forthis
to existsuper()
can't be used in an bound ES constructor function() =>
super
can't be called from an external constructorsuper
can't be called more than once in a constructorsuper
can be called in overridden methods, the syntax becomessuper.methodName()
This leads to some definite breaks in how the original CS classes operated, but probably the biggest restriction is the first one:
super()
needs to be called in a constructor forthis
to exist. The reason this becomes an issue is a pretty common use case:@
parameters.For example the following code won't compile:
This is because to refer to @name we actually have to make a
super()
call. connec played with the idea of automatically inserting a super() in the generated code, which required hoisting it to the top of the method. This unfortunately means that a parent constructor is getting called without your knowledge, leading to unpredictable inheritance. You might not want to call the original constructor, but by using@
parameters you inadvertently call into the parent, potentially without fulfilling it's signature requirements.In addition, the following leads to a race condition:
since the @name parameter requires this within the super call.
I understand that sneaking a
super()
into the constructor transparently can be an issue, but is there a way to makethis
available in a subclass without super? Perhaps a blend of the original CS and ES6?I personally would want to keep as much of the existing CS syntax as possible.
Thoughts?
The text was updated successfully, but these errors were encountered: