ES6新增class关键字,class关键字也是原型对象的一个语法糖,让原型对象更加的清晰,
我们先回顾一下原型对象,如下图,原型对象是不是包含一个constructor函数,这个函数的所引指向的是函数的构造方法,所以 我们先明确一下,所谓的类其实就是原型对象呢,对类的初始化是调用的构造方法constructor函数,故生成的是构造函数的实例对象
- 用class定义一个新的类,语法:class 类名{类体},class类的特点:
- 定义的class类,他的数据类型是函数,类名指向的是其构造函数的索引,即生成的实例是构造函数的实例,
- 用new 类名()创建一个实例对象,该实例对象是由构造函数初始化的,所以他的属性是构造函数包含的属性,构造函数外面的都是继承属性了。
- class类体里面必须有一个构造函数,即constructor(){}函数,如果没有定义会自动生成一个的空的constructor函数
- class里面的函数是不需要用关键字function定义的,直接函数名就可以,并且函数之间不需要用逗号隔开,会报错的
- _proto_:指向构造方法的原型对象
- hasOwnProperty():判断一个对象中是否含有属性和方法,返回布尔类型值
class CustomHTMLElement {
constructor(element) {
this.element = element;
}
get html() {
return this.element.innerHTML;
}
set html(value) {
this.element.innerHTML = value;
}
}
var descriptor = Object.getOwnPropertyDescriptor(
CustomHTMLElement.prototype, "html"
);
"get" in descriptor // true
"set" in descriptor // true
- 静态方法:在函数前面添加static关键字,声明改方法为静态方法,静态方法就是不用实例化就可以直接调用的方法,非静态方法是必须经过实例化才可以调用的方法。
- 静态方法是不可以被实例对象继承的,所以类创建的实例对象是不可以调用的,会报错
- 静态方法可以直接被类调用即类名.静态方法的s形式调用
- 静态方法中的this值得是类而不是实例
- 静态方法和费静态方法是可以重名显示的
class Foo {
static bar() {
this.baz();
}
static baz() {
console.log('hello');
}
baz() {
console.log('world');
}
}
Foo.bar() // hello
- 静态属性:在属性前面添加static关键字是不可以 将属性变为静态属性的,所谓的静态属性值得是,该属性是类的属性而不是实例化的属性,即不需要实例化的属性。