Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ES6中命名或未命名类表达式的用途是什么?_Javascript_Ecmascript 6 - Fatal编程技术网

Javascript ES6中命名或未命名类表达式的用途是什么?

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

在代码中,我使用了一个命名类“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: "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