es6-类
es6有一种与其他语言中类似的特性:类声明。同时,他也是es6中最简单的形式。
基本的类声明语法
要声明一个类,首先编写class关键字,紧跟着的是类的名字,其他部分的语法类似于对象字面量的简写形式,但不需要在类的各元素之间使用逗号分隔。请看这段简单的类声明代码。
class PersonClass{
constructor(name){
this.name=name;
}
sayName(){
console.log(this.name)
}
}
let person=new PersonClass('jiaojiao');
person.sayName();
console.log(person instanceof PersonClass);//true
console.log(person instanceof Object);//true
console.log(typeof PersonClass);//function
console.log(typeof PersonClass.prototype.sayName);//function
注:与函数不同的是,类属性不可被赋予新值,在之前的实例中,PersonClass.prototype就是这样一个只读的类属性。
为何使用类语法
尽管类与自定义类型之间有诸多相似之处,我们仍需牢记它们的这些差异。
● 函数声明可以被提升,而类声明与let类似,不能被提升。真正执行声明语句前,它们会存在于临时死区中。
● 类声明中的所有代码将自动运行在严格模式下,而且无法强行让代码脱离严格模式执行。
● 在自定义类型中,需要通过Object.defineProperty()方法手工指定某个方法不可枚举
● 每个类都有一个名为(Construct)的内部方法,通过关键字new调用那些(Construct)的方法会导致程序抛出错误
● 使用除关键字new 以外的方式调用类的构造函数会导致程序抛出错误。
● 在类中修改类名会导致程序错误
const PersonType2=(function(){
'use strict';
const PersonType2=function(name){
this.name=name;
}
Object.defineProperty(PersonType2.prototype,'sayName',{
value:function(){
console.log(this.name);
},
enumerable:false,
writable:true,
configurable:true
})
return PersonType2;
}());
class Foo {
constructor() {
Foo = 'bar'
}
}
Foo = 'bar'
命名类表达式
在上一节的示例中,我们定义的类的表达式是匿名的,其实类和函数一样,都可以定义为命名表达式。声明时