45

I am playing with the new stuff in JavaScript/ES6. I get an Uncaught ReferenceError: this is not defined(...) player.js:5 in my code. As far as I see, there are no errors here! Is this a bug? Any workarounds?

index.html

<html>
    <head>
        <script type="text/javascript" src="js/entity.js"></script>
        <script type="text/javascript" src="js/player.js"></script>
        <link href="css/style.css" rel="stylesheet" type="text/css">
        <title>Test</title>
    </head>
    <body>
        <canvas id="screen" width=500 height=500></canvas>
        <script type="text/javascript">initialize();</script>
    </body>
</html>

entity.js

"use strict";

class Entity {
    constructor() {
        console.log("Entity");
    }
}

player.js

"use strict";

class Player extends Entity {
    constructor() {
        console.log("Created"); // <- error here
    }
}
Leon Adler
  • 2,993
  • 1
  • 29
  • 42
bshaw
  • 485
  • 1
  • 6
  • 9
  • 1
    Am I missing something or did you never declare `initialize` anywhere??? – Bergi Sep 11 '15 at 22:33
  • It was old and irrelevant code that was left in my mistake. – bshaw Sep 13 '15 at 05:22
  • 1
    Possible duplicate of [Javascript ES6 class extend without super](http://stackoverflow.com/questions/31067368/javascript-es6-class-extend-without-super) – Makyen Jan 31 '17 at 17:59

1 Answers1

68

This is a fact of the new class syntax. Your subclass needs to call super() in order for the class to be properly initialized, e.g.

super(arg1, arg2, argN);

with whatever arguments the parent constructor needs.

It is required that, if execution reaches the end of a constructor function, the value of this needs to have been initialized to something. You either need to be in a base class (where this is auto-initialized), have called super() so this is initialized, or returned an alternative object.

class Player extends Entity {
  constructor() {
    super();
    console.log("Created"); ;// error here
  }
}

You can think of it like constructor functions kind of have an automatic return this at the end of them.

loganfsmyth
  • 156,129
  • 30
  • 331
  • 251