最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

ecmascript 6 - How to redefine JavaScript classes, in the console? - Stack Overflow

programmeradmin6浏览0评论

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 like let Foo = class Foo {}; so you can reassign Foo if you want, but you can't do a second declaration because you can't let-declare the same thing twice. – loganfsmyth Commented Nov 7, 2016 at 17:40
 |  Show 8 more ments

4 Answers 4

Reset to default 12

None 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

发布评论

评论列表(0)

  1. 暂无评论