6

我对 JS 类相当陌生,并且主要从事后端工作。

我正在玩新的 JS 类,所以我开始在这里查看示例:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes

我去了 chrome (chromium) 开发者工具控制台,我写了 Polygon 类:

class Polygon {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
}

然后我想根据包含方法的示例重新定义类,所以我写道:

class Polygon {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }

  get area() {
    return this.calcArea();
  }

  calcArea() {
    return this.height * this.width;
  }
}

这会引发错误:Uncaught SyntaxError: Identifier 'Polygon' has already been declared(…)

现在我知道 ES6 中有一个新的作用域,并且类会自动使用新的作用域等等……但实际上,我该如何重新定义我的类?:D

我经常写 Python,所以我习惯于重新定义我想要的一切。

4

3 回答 3

11

没有一个答案在不更改原始代码的情况下提供解决方案......所以这里是精炼的解决方案。

如果在代码中你有这样的东西:

class Polygon {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
}

那么这意味着您已经创建了一个let名为Polygon. 您不能重新声明Polygon,但可以重新分配它。

因此,如果您需要在例如 JS 控制台中进行实验,只需执行以下操作:

Polygon = class {
  //... new stuff here
}

这将替换原来的类,但不会违反let限制。

您可以通过将上述代码粘贴到控制台中来尝试一下,然后尝试new Polygon(1,2).

于 2018-07-18T21:23:53.993 回答
6

块范围声明 ( let, const, class) 不能重新声明。

类表达式var可用于在控制台中重用和重新声明变量:

var Polygon = class Polygon  { ... };
new Polygon();
var Polygon = class Polygon  { ... };
new Polygon();
于 2016-11-07T17:38:51.253 回答
2

我使用的是 Chrome 版本 54.0.2840.71(64 位),虽然我可以打开控制台并声明一个新类,但我无法重新定义一个类(你会收到错误消息:VM272:1 Uncaught SyntaxError: Identifier 'Thing' has already been declared,因为我试图重新定义我的班级Thing)。

如果您只是想稍后将方法添加到类中,可以将它们添加到类的prototype

Polygon.prototype.area = function() {
  // do some stuff
}

但是,在这种情况下,它不会是getter您示例中的方法。

编辑

为了避免语法错误,如果你只是将一个类重新分配为一个变量,它应该做你想做的事:

// in your original code

var Polygon = class{}

// in the console

var Polygon = class {
  // with new stuff
}
于 2016-11-07T17:31:46.423 回答