对于类表达式,您可以在内部使用类名 ,但不能在类之外使用:
const Foo = class Self {
static greetingPrefix() {
return 'Hello, ';
}
greeting() {
return Self.greetingPrefix() + 'World';
}
};
const foo = new Foo();
console.log(foo.greeting()); // "Hello, World"
console.log(Self); // throws "Uncaught ReferenceError: Self is not defined"
使用以下代码
var car = class Car{ /* ... */ }
var carNew = new Car("ferrari");
抛出错误,为什么?
Car
因为您编写了一个类表达式,所以没有进入范围,类似于function
在函数表达式中使用
var foo = function Bar() {}; foo; // defined Bar; // undefined
var carNew = new car("ferrari");
工作,为什么?
出于与上述相同的推理,car
标识符在您的范围中定义并指向类表达式
什么是命名或未命名的类表达式的使用[...]?
让我们function
再看一遍.所以现在想一想,如果Bar
没有在我们工作的范围内定义,它在哪里定义?
嗯,显然我们有foo.name === 'Bar'
,但我们也可以
var foo = function Bar() {console.log(Bar)}; foo(); // Bar logged, we see Bar === foo here
太棒了,所以我们可以Bar
在函数里面引用.
它完全相同class
,我们可以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)