JavaScript中类(class)的介绍和应用

一、类的概念

二、类的使用

1、语法 

2、实例

三、类的属性 

1、静态属性

2、实例属性

3、私有属性

四、类的方法

1、构造方法

2、静态方法

3、普通方法

 五、类的继承 

1、extends

2、super


一、类的概念

什么是类?

在生活中,类一些具有相似属性和行为的事物抽象出来的概念,比如:人类、球类、汽车类;

在JavaScript中,类是模板,是用于创建实例对象的模板;相当于实例的原型(prototype);

二、类的使用

1、语法 

class 类名 {  
  constructor(){
      ...
    }
  ...
}
  • class:ES6中提供了class关键字,用来创建类;
  • 类名:一般为名词,采用首字母大写表示,如Person、Car...;
  • {......}:类体放在一对大括号中, 我们可以在大括号内定义类的成员,比如构造函数、静态方法,等等;
  • constructor(){......}:每个类都会包含的一个特殊方法,类的构造函数,用来实例化一个由class创建的对象;

2、实例

// 定义类
class ClassName {
  // 构造方法
  constructor(name) {
    this.name = name; // 实例属性
  }
  static author = "zyl"; // 静态属性

  #attr = 10; // 私有属性

  // 静态方法
  static sFn(data) {
    return `我是静态方法,只能通过类名调用,接收的参数为${data};`;
  }

  // 普通方法
  fn(data) {
    console.log(`私有属性的值为${this.#attr};`);   // 访问私有属性
    return `我是普通方法,通过实例调用,接收的参数为${data};`;
  }
}
// 实例化
const class1 = new ClassName("第一个类");
console.log(class1); // ClassName {name: '第一个类'}

// 访问静态属性
console.log(ClassName.author); // zyl

// 访问实例属性
console.log(class1.name); // 第一个类

// 访问静态方法
console.log(ClassName.sFn("arg")); // 我是静态方法,只能通过类名调用,接收的参数为arg;

// 访问实例方法
console.log(class1.fn("123")); // 私有属性的值为10; 我是普通方法,通过实例调用,接收的参数为123;

三、类的属性 

 JavaScript类中的属性有:静态属性、实例属性、私有属性;

1、静态属性

类的属性,使用static关键字定义,通过【类名.属性名】访问;

2、实例属性

定义在构造函数的this上,通过【实例.属性名】访问;

3、私有属性

使用【#属性名】的方式定义,只能在类的内部访问;

// 定义类
class ClassName {
  // 构造方法
  constructor(name) {
    this.name = name; // 实例属性
  }
  static author = "zyl"; // 静态属性

  #attr = 10; // 私有属性
  fn() {
    return this.#attr;
  }
}
// 实例化
const class1 = new ClassName("第一个类");
console.log(class1); // ClassName {name: '第一个类'}

// 访问静态属性
console.log(ClassName.author);  // zyl

// 访问实例属性
console.log(class1.name);   // 第一个类

// 访问私有属性
console.log(class1.fn()); // 10

四、类的方法

JavaScript类中方法有:构造方法、静态方法、普通方法、私有方法;

1、构造方法

构造方法是一种特殊的方法:

  • 名称为constructor();
  • 一个类中可以添加一个构造方法,用于对类进行实例化;
  • 构造方法中可以对初始化对象属性;
  • 使用new关键字实例化时,会自动执行constructor();
  • 定义类时,若没有定义constructor()构造方法,JavaScript会自动声明一个空的constructor()方法;
// 定义Person类
class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
}

// 创建person1实例对象
const person1 = new Person("zyl", 18);
console.log(person1);         // Person {name: 'zyl', age: 18}

2、静态方法

使用static关键字定义,又叫类方法,它是属于类的,而非实例对象;

静态方法不能继承,不能通过实例调用,只能通过当前类名调用【类名.方法名】(父类的静态方法可以被子类继承);

// 定义品牌类
class Brand {
  constructor(name, type) {
    this.name = name;
    this.type = type;
  }

  // 静态方法,判断是否为vip用户
  static isVip(count) {
    return count == "zylcount" ? "Vip用户" : "新用户";
  }

  // 静态方法,获取品牌折扣价
  static dPrice(price) {
    return price > 10 ? price * 0.9 : price * 0.95;
  }
}

const brand1 = new Brand("zylBrand", "clothing");
console.log(brand1);                     // Brand {name: 'zylBrand', type: 'clothing'}

// 调用静态方法,通过类名Brand调用,而非实例brand1调用;
console.log(Brand.isVip("1111111"));     // 新用户
console.log(Brand.dPrice(12));           // 10.8

3、普通方法

类中可以定义任意数量的普通方法;

普通方法定义在类的原型上(prototype属性上),会被实例继承;

通过实例调用【实例.方法名】,不能通过类名调用;

// 定义汽车类
class Car {
  constructor(brand, price) {
    this.brand = brand;
    this.price = price;
  }
  // 定义普通方法 
  getInfo() {
    return `该车的品牌是${this.brand};售卖价格是${this.price}`;
  }
}
let car1 = new Car("volvo", "16.8w");
console.log(car1);                 //  {brand: 'volvo', price: '16.8w'}

// 通过实例调用普通方法
console.log(car1.getInfo());       //  该车的品牌是volvo;售卖价格是16.8w

// 普通方法是定义在Car类的原型上
console.log(Car.prototype);   // {constructor: ƒ, getInfo: ƒ}
console.log(Car.prototype.getInfo === car1.__proto__.getInfo);   // true

 五、类的继承 

JavaScript中允许我们在创建一个类的时候,依赖于另一个类;被创建的类称为【子类/派生类】,被依赖的类称为【父类/基类】;子类会继承父类的属性和方法,有利于提高代码的可复用性;

1、extends

extends关键字,用于类的继承;使创建子类继承一个父类, 子类会继承父类的所有属性和方法;

(1)语法

class 子类 extends 父类 {
    // 定义子类的属性和方法
    ...    
}

 (2)实例

class ParentClass {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
  static attr = 'abc';
  static sFn(data){
    return `我是定义在父类的静态方法,收到的参数为:${data}`;
  }
  getInfo(data) {
    return `我是定义在父类的普通方法,收到的参数为:${data}`;
  }
}

class ChildClass extends ParentClass { }

const parent1 = new ParentClass('parent', '45');  
const child1 = new ChildClass('zyl', 20);  
console.log(parent1);                 // ParentClass {name: 'parent', age: '45'}
console.log(child1);                  // ChildClass {name: 'zyl', age: 20}
console.log(ChildClass);              // class ChildClass extends ParentClass {}
console.log(ChildClass.attr);         // abc
console.log(ChildClass.sFn('1111'));  // 我是定义在父类的静态方法,收到的参数为:1111
console.log(child1.getInfo(123));     // 我是定义在父类的普通方法,收到的参数为:123

2、super

super关键字用于调用父类的属性和方法;在调用时,需要指定调用的父类属性或父类方法;

super必须写在this.XXX之前;

(1)语法

// 调用父类的构造方法
super();   
// 访问父类属性
super.属性;    
// 调用父类方法  
super.方法名(); 

(2)实例

// 定义父类
class ParentClass {
  constructor(name, age, address) {
    this.name = name;
    this.age = age;
    this.address = address;
  }
  static attr = "abc";
  static sFn(data) {
    return `我是定义在父类的静态方法,收到的参数为:${data}`;
  }
  getInfo(data) {
    return `我是定义在父类的普通方法,收到的参数为:${data}`;
  }
}

// 定义子类,继承父类
class ChildClass extends ParentClass {
  constructor(name, age, address, phone) {
    // 调用父类的构造方法
    super(name, age,  address);
    this.phone = phone;
  }

  // 访问父类的静态属性
  static attr = super.attr + "def";
  static sFn(data) {
    // 调用父类的静态方法
    console.log(`子类通过super调用:${super.sFn("super调用的实参")}`);
    return `我是定义在子类的静态方法,收到的参数为:${data}`;
  }
  getInfo(data) {
    // 调用父类的普通方法
    console.log(`子类通过super调用:${super.getInfo("super调用的实参")}`);
    return `我是定义在子类的普通方法,收到的参数为:${data}`;
  }
}

const parent1 = new ParentClass("parent", 45 , "上海");
const child1 = new ChildClass("child", 20, "上海", '11111111');

console.log(parent1);                 // ParentClass {name: 'parent', age: 45, address: '上海'}
console.log(child1);                  // ChildClass {name: 'child', age: 20, address: '上海'}

console.log(ParentClass.attr);        // abc
console.log(ChildClass.attr);         // abcdef

console.log(ParentClass.sFn("111"));  // 我是定义在父类的静态方法,收到的参数为:111

console.log(ChildClass.sFn("222"));   // 子类通过super调用:我是定义在父类的静态方法,收到的参数为:super调用的实参
                                      // 我是定义在子类的静态方法,收到的参数为:222

console.log(parent1.getInfo(123));    // 我是定义在父类的普通方法,收到的参数为:123                                   
console.log(child1.getInfo(456));     // 子类通过super调用:我是定义在父类的普通方法,收到的参数为:super调用的实参 
                                      // 我是定义在子类的普通方法,收到的参数为:456

======================================================================

今天就先介绍到这里吧~

内容不多,希望有用!

如有问题,还行指正!!! 

  • 31
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript中的class)和Java中的有一些相似之处,但也存在一些区别。 1. 语法差异:在Java中,的定义是使用关键字"class",后跟名。而在JavaScript中,的定义是通过关键字"class",后跟名和一个体(包含的属性和方法)。 Java示例: ```java public class MyClass { // 的属性 // 的方法 } ``` JavaScript示例: ```javascript class MyClass { // 的属性 // 的方法 } ``` 2. 继承机制:Java中的可以通过继承来扩展现有的功能,使用关键字"extends"。而JavaScript中的也支持继承,但使用的是关键字"extends"和"super"。 Java示例: ```java public class ChildClass extends ParentClass { // 子的属性 // 子的方法 } ``` JavaScript示例: ```javascript class ChildClass extends ParentClass { constructor() { super(); // 调用父的构造函数 // 子的属性 } // 子的方法 } ``` 3. 成员:Java中的成员(属性和方法)可以使用访问修饰符(例如public、private、protected)来控制其可见性。而JavaScript中的成员默认是公开的,可以使用关键字"public"、"private"、"protected"来控制可见性。 Java示例: ```java public class MyClass { private int myPrivateVar; // 私有属性 public void myPublicMethod() { // 公共方法 } } ``` JavaScript示例: ```javascript class MyClass { #myPrivateVar; // 私有属性 myPublicMethod() { // 公共方法 } } ``` 这些是JavaScript和Java之间的一些主要差异。虽然它们有共同之处,但也有一些不同之处,因此在使用时需要注意。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值