我对 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 中有一个新的作用域,并且类会自动使用新的作用域等等......但实际上,我如何重新定义我的类?
没有一个答案可以在不更改原始代码的情况下提供解决方案......所以这里是改进的解决方案。
如果在代码中你有这样的东西:
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)
。
块作用域声明(
let
、const
、class
)无法重新声明。
类表达式和
var
可用于在控制台中重用和重新声明变量:
var Polygon = class Polygon { ... };
new Polygon();
var Polygon = class Polygon { ... };
new Polygon();
我使用的是 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
}
很好,
所以现在我所有的类文件都是这样开始的:
if(typeof(someClass)== undefined){
class someClass{}
}
someClass= class{
constructor(){
console.log(typeof(someClass));
}
}
const newobject= new someClass();
块引用