I'm fairly new to JS classes, and am doing mostly back-end work.
I was playing around with the new JS classes and so I started going through the examples here:
I went to the chrome (chromium) developer tools console and I wrote the Polygon class:
class Polygon {
constructor(height, width) {
this.height = height;
this.width = width;
}
}
Then I wanted to redefine the class, according to the example containing the methods, so I wrote:
class Polygon {
constructor(height, width) {
this.height = height;
this.width = width;
}
get area() {
return this.calcArea();
}
calcArea() {
return this.height * this.width;
}
}
This raises an error: Uncaught SyntaxError: Identifier 'Polygon' has already been declared(…)
Now I understand there's a new scoping in ES6, and that classes automatically use the new scoping and so on... but really, how do I redefine my class?
I'm fairly new to JS classes, and am doing mostly back-end work.
I was playing around with the new JS classes and so I started going through the examples here: https://developer.mozilla/en-US/docs/Web/JavaScript/Reference/Classes
I went to the chrome (chromium) developer tools console and I wrote the Polygon class:
class Polygon {
constructor(height, width) {
this.height = height;
this.width = width;
}
}
Then I wanted to redefine the class, according to the example containing the methods, so I wrote:
class Polygon {
constructor(height, width) {
this.height = height;
this.width = width;
}
get area() {
return this.calcArea();
}
calcArea() {
return this.height * this.width;
}
}
This raises an error: Uncaught SyntaxError: Identifier 'Polygon' has already been declared(…)
Now I understand there's a new scoping in ES6, and that classes automatically use the new scoping and so on... but really, how do I redefine my class?
Share Improve this question edited Mar 1, 2024 at 17:06 miken32 42.7k16 gold badges121 silver badges172 bronze badges asked Nov 7, 2016 at 17:26 vlad-ardeleanvlad-ardelean 7,62215 gold badges86 silver badges127 bronze badges 13- So when you wrote that second part, you got an error? – Heretic Monkey Commented Nov 7, 2016 at 17:29
-
I'm not following. Are you trying to have two classes named
Polygon
but one defined with a third property and method? – Stephen Gilboy Commented Nov 7, 2016 at 17:29 -
I'm trying to do something like this:
var Polygon = <my class>; Polygon = <redefine the class>
. I'm trying to redefine the class, which means I want to forget the old definition, and use the new one. – vlad-ardelean Commented Nov 7, 2016 at 17:30 -
1
You should be able to do
Polygon = class { ... }
to reassign the class. – loganfsmyth Commented Nov 7, 2016 at 17:34 -
2
Correct.
class Foo {}
is exactly likelet Foo = class Foo {};
so you can reassignFoo
if you want, but you can't do a second declaration because you can'tlet
-declare the same thing twice. – loganfsmyth Commented Nov 7, 2016 at 17:40
4 Answers
Reset to default 12None of the answers provide a solution without changing original code... So here is refined solution.
If in code you have something like this:
class Polygon {
constructor(height, width) {
this.height = height;
this.width = width;
}
}
Then this means you've created a let
variable named Polygon
. You cannot redeclare Polygon
, but you can reassign it.
So if you need to experiment in e.g. JS console just do:
Polygon = class {
//... new stuff here
}
This will replace the original class but will not violate let
restrictions.
You can try this out by pasting above code in the console, and then try new Polygon(1,2)
.
Block scope declarations (let
, const
, class
) cannot be redeclared.
Class expression and var
can be used to re-use and re-declare variables in console:
var Polygon = class Polygon { ... };
new Polygon();
var Polygon = class Polygon { ... };
new Polygon();
I'm on Version 54.0.2840.71 (64-bit) of Chrome, and although I can open up the console and declare a new class, I can't redefine a class (you'll get the error: VM272:1 Uncaught SyntaxError: Identifier 'Thing' has already been declared
, since I tried to redefine my class Thing
).
If you simply want to add methods onto the class later, you can add them to the class's prototype
:
Polygon.prototype.area = function() {
// do some stuff
}
In that case, however, it won't be a getter
method like in your example.
Edit
To get around the syntax error, if you just reassign a class as a variable, it should do what you want:
// in your original code
var Polygon = class{}
// in the console
var Polygon = class {
// with new stuff
}
Nice,
So now all of my class files begin like this:
if(typeof(someClass)== undefined){
class someClass{}
}
someClass= class{
constructor(){
console.log(typeof(someClass));
}
}
const newobject= new someClass();
Blockquote