Javascript ES6中命名或未命名类表达式的用途是什么?
在代码中,我使用了一个命名类“Car”。现在,如果我试着使用像Javascript ES6中命名或未命名类表达式的用途是什么?,javascript,ecmascript-6,Javascript,Ecmascript 6,在代码中,我使用了一个命名类“Car”。现在,如果我试着使用像var carNew=新车(“法拉利”),然后它会给我一个错误那么ES6中命名类表达式的用途是什么呢? 'use strict'; var car = class Car{ constructor(model){ this.model = model; } } var carNew = new car("ferrari"); console.log(carNew); //car {model: "ferr
var carNew=新车(“法拉利”)代码>,然后它会给我一个错误那么ES6中命名类表达式的用途是什么呢?
'use strict';
var car = class Car{
constructor(model){
this.model = model;
}
}
var carNew = new car("ferrari");
console.log(carNew); //car {model: "ferrari"}
console.log(carNew.constructor == car); //true
使用以下代码
var car = class Car{ /* ... */ }
var carNew=新车(“法拉利”)代码>抛出错误,为什么
Car
未进入范围,因为您编写了一个类表达式,类似于在函数表达式中使用function
var carNew=新车(“法拉利”)代码>有效,为什么
对于与上面相同的推理,car
标识符在您的范围中定义,并指向类表达式
命名或未命名类表达式[…]的用途是什么
让我们再次回顾函数
。那么现在想想,如果Bar
没有在我们工作的范围内定义,它是在哪里定义的
当然,我们有foo.name==='Bar'
,但我们也可以这样做
var foo = function Bar() {console.log(Bar)};
foo(); // Bar logged, we see Bar === foo here
太好了,所以我们可以在函数中引用Bar
这与类
完全相同,我们可以从类表达式本身中引用Car
,让我们执行递归行为或将静态引用复制到实例等
我添加了这样一个引用,以便于在下面的代码中看到
var car = class Car {
constructor(model) {
this.model = model;
this.foo = Car; // the big C Car that was ReferenceErroring outside
}
};
var bar = new car();
console.log(bar.foo); // logs class Car (=== car)
与命名/未命名函数的用法相同。查看函数行为:
var a = function b() { console.log('b') }
>> undefined
a()
>> b
b()
>> Uncaught ReferenceError: b is not defined(…)
这与你的情况非常相似
在哪里以及为什么需要使用它?通常,函数的唯一用例是命名一次调用的函数,这给了您某种自我记录的能力:
(function bootstrap() {
//
})();
这里的函数名表示你的函数引导你的应用程序
因此,我可以想象该类的另一种情况:您可以将其用于仅用于创建一个对象的类:
var a = new (class Car{
constructor(model){
this.model = model;
}
})('ferrari');
console.log(a.model);
在这里,您只需命名类以了解它在做什么,但是在其他地方无法访问该名称。对于类表达式,您可以在内部使用类名,但不能在类外部使用:
const Foo=类自身{
静态问候前缀(){
返回“你好”;
}
问候语(){
返回Self.greetingPrefix()+“World”;
}
};
const foo=新foo();
console.log(foo.greeting());//“你好,世界”
console.log(Self);//抛出“未捕获引用错误:未定义自身”
它抛出了一个错误,因为未声明Car
变量
从文件:
函数声明和类之间的一个重要区别
声明是函数声明被提升和类
声明并非如此。您首先需要声明您的类,然后
访问它,否则像下面这样的代码将抛出
参考误差
因此,使用:
var newCar = Car('ferrari');
您必须定义Car
变量:
var-Car=等级车{
建造师(模型){
this.model=模型;
}
}
注意这里我们使用汽车
而不是汽车
关于未命名和命名的类表达式,下面是来自JavaScript | MDN文档的一个示例:
类表达式是定义类的另一种方法。类表达式
可以命名或不命名。指定给命名类表达式的名称为
本地到类的主体
//未命名
var多边形=类{
建造商(高度、宽度){
高度=高度;
这个。宽度=宽度;
}
};
//命名
var Polygon=类多边形{
建造商(高度、宽度){
高度=高度;
这个。宽度=宽度;
}
};
阅读了解更多信息类表达式
与函数类似,有两种类型的类定义,定义类的两种方法:类声明和类表达式
与函数类似,类表达式的标识符仅在表达式中可见:
const MyClass = class Me {
getClassName() {
return Me.name;
}
};
const inst = new MyClass();
console.log(inst.getClassName()); // Me
console.log(Me.name); // ReferenceError: Me is not defined
抛出了什么错误?未捕获引用错误:Car未定义上述代码不会抛出错误如果将类名用作“Car”,则只有它才会抛出错误。我想了解命名和未命名类表达式的用途是什么?当我们需要使用命名类表达式class
包装构造函数时,所以你不能像调用构造函数一样调用这个类;作为一个密切相关的旁注:谢谢,这将有助于我。请注意,静态类属性不属于ES6规范的一部分,它们是为ES 2016(又名ES 7)提出的。@JaredSmith是的,类属性不属于ES6规范的一部分。但是类方法(在示例中使用)是规范的一部分(请参阅)
const MyClass = class Me {
getClassName() {
return Me.name;
}
};
const inst = new MyClass();
console.log(inst.getClassName()); // Me
console.log(Me.name); // ReferenceError: Me is not defined