Class的基本使用和继承

什么是类?

简单的理解,类就是具有相同属性和行为的一类群体;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);
      }
}

小结:

一切事物的开头都不是一件容易的事,都是在不断学习中进步,尽管现在的我很菜,也希望与大家互相帮助,互相学习,与互相进步。伙伴们,自己尝试着打代码,自己总结方法,归结要点,不会的时候多去查查。加油,程序员战队

猜你喜欢

转载自blog.csdn.net/weixin_46041654/article/details/103603030