什么是类?
简单的理解,类就是具有相同属性和行为的一类群体;class 就像是特殊的函数,和创建函数一样,有类声明(class declarations),和类表达式( class expressions )两种.
1.类的简单使用
语法为:
class 类名{
方法名(){
//方法体
}
}
var 变量名 = new 类名();
2.类的构造方法
constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。
代码块如下
class Mao{//类名首字母必须大写,类名可以随意起,不作特定设置
constructor(name,age,hobby){//this.name,this.age,this.hobby指的都是属性
this.name =name,
this.age = age,
this.hobby = hobby
}
read(){//read()在这里指的是方法
document.write("小毛爱吃东西。。。"+this.name+"<br>");
}
}
var s1 = new Mao("小毛",18,"eat");//实例化一个对象
s1.read();
console.log(s1.name);
console.log(s1.age);
console.log(s1.hobby);
注:
1.this指的是当前对象
2.类声明:使用class 关键字,后面跟上类名(class 关键字后面的是类名)
3.实例属性与实例方法
3.1 类的实例属性可以用等式,写入类的定义之中
3.1.1 在类中定义
class MyClass {
myProp = 42;
constructor() {
console.log(this.myProp); // 42
}
}
//上面代码中,myProp就是MyClass的实例属性。在MyClass的实例上,可以读取这个属性。
3.2类的实例方法
3.2.1实例方法:就是类中的自己调用的普通的方法
class Myclass{
write(){
console.log("我喜欢唱歌和写作") ;
}
}
var s1 = new Myclass();
s1.write();//调用函数
4. 静态属性和静态方法
4.1 关于静态属性的理解及使用
4.1.1静态属性指的是 Class 本身的属性,而不是定义在实例对象(this)上的属性。
新版本
class Foo {
}
Foo.prop = 1;
Foo.prop // 1
//Foo类定义了一个静态属性prop,只有这种写法可行,因为 ES6 明确规定,Class 内部只有静态方法,没有静态属性。
老版本:类的静态属性只要在上面的实例属性写法前面, 加上static关键字就可以了。
class MyClass {
static myStaticProp = 42;
constructor() {
console.log(MyClass.myProp); // 42
}
}
4.2静态方法的理解及使用
4.2.1 static关键字用来定义类的静态方法。静态方法是指那些不需要对类进行实例化,使用类名就可以直接访问的方法。静态方法经常用来作为工具函数。
代码块展示:
class Foo {
static classMethod() {
return 'hello';
}
}
Foo.classMethod() // 'hello'
var foo = new Foo();
foo.classMethod()
5.this和super关键字
5.1.1 this理解
(1)this关键字代表了所属函数的调用者对象
(2)this关键字代表的是对象的引用,也就是this在指向一个对象,所指向 就是调用该函数的对象引用;
5.1.2this关键字的作用:
(1)如果存在同名的成员变量与局部变量时,在方法内部默认是访问局部变 量的数据,可以通过this关键字指定访问成员变量的数据;
(2)在一个构造函数中可以调用另外一个构造函数初始化对象;
5.1.3this关键字要注意的事项:
(1)存在同名的成员变量与局部变量时,在方法的内部访问的是局部变量(Java采取的是“就近原则”的机制访问的);
(2)如果在一个方法中访问了一个变量,该变量只存在成员变量的情况下,那么Java编译器会在该变量的前面添加this关键字;
5.1.4 super这个关键字, 有两种用法, 含义不同。
( 1) 作为函数调用时( 即super(…args)), super代表父类的构造函数。
( 2) 作为对象调用时( 即super.prop或super.method()), super代表父类。 注意, 此时super即可以引用父类实例的属性和方法, 也可以引用父类的静态方法。
class B extends A {
get m() {
return this._p * super._p;
}
set m() {
throw new Error(' 该属性只读 ');
}
}
上面代码中, 子类通过super关键字, 调用父类实例的_p属性。
由于, 对象总是继承其他对象的, 所以可以在任意一个对象中, 使用super关键字。
var obj = {
toString() {
return "MyObject: " + super.toString();
}
};
obj.toString(); // MyObject: [object Object]
6.继承
6.1实例一
class Father {
}
class Son extends Father {
}
Son 类通过extends关键字,继承了Father类的所有属性和方法,由于没有部署任何代码,所以这两个类完全一样,等于复制了一个Father类。
6.2实例二
class Son extends Father {
constructor (name,age,city) {
super(name,age);//调用父类的constructor(name,age);
this.city = city;
}
toString () {
return this.city+ " " +super.toString();//调用父类的toString()
}
}
//constructor方法和toString方法之中,都出现了super关键字,
//他在这里表示父类的构造函数,用来新建父类的this对象;
子类必须在constructor方法中调用super方法,否则会报错,因为子类没有自己的this对象,而是继承父类的this对象,然后对其进行加工,如果不调用super方法,子类就得不到this对象;
注:1.ES5的继承和ES6的继承不一样,现在的我们重要掌握ES6 的继承,ES6 的继承实质是先创造父类的实例对象this(所以必须先调用super方法),然后再用子类的构造函数修改this;
2.如果子类没有定义constructor方法,这个方法会默认添加,也就是说,不管有没有显式定义,任何一个子类都有constructor方法。
代码块展示:
class Son extends Father {
}
//等同于
class Son extends Parent {
constructor(...args) {
super(...args);
}
}
小结:
一切事物的开头都不是一件容易的事,都是在不断学习中进步,尽管现在的我很菜,也希望与大家互相帮助,互相学习,与互相进步。伙伴们,自己尝试着打代码,自己总结方法,归结要点,不会的时候多去查查。加油,程序员战队