Es6之Class详解(含常问面试题)

Class

js中class的由来是由构造函数衍生出来的在我们默认把首字母大写的函数称为构造函数

		function Person () {
			console.log("this is a method");
		}

而在es6中就引入class的关键字,class只是一个语法糖,它的实现基本可以使用es5实现

		function Person () {
			console.log("this is a method");
		}
		class Perosn {
			constructor() {
			    
			}
		}
		console.log(typeof Person);//function

在class中声明方法其实就是声明在原型上

		class Person {
			constructor() {
			    
			}
			sayHello(){
				
			}
		}
		let person1 = new Person();
		console.log(person1.__proto__);

在这里插入图片描述

constructor

在class中默认都会创建class方法如果没有创建则js引擎会自动添加一个空的constructor方法

		class Person {
			
		}
		//等价
		class Person {
			constructor() {
			    
			}
			
		}

set和get

用来设置对某个属性设置和取值的函数,可以在这个set/get函数中做一些事情
这里我对属性x设置存储函数操作x属性时就会触发

		class Person {
			constructor() {
			    this.x=0; //set触发
			}
			sayHello(){
				console.log('test');
			}
			set x(val){
				console.log("set触发");
			}
			get x(){
				console.log("get触发");
			}
			
		}
		let person1 = new Person();
		person1.x=2; //set触发
		console.log(person1.x); //get触发

generator方法

在class里声明generator方式在方法前加*

		class Person {
			constructor() {
				
			}
			toString(){
				console.log('parent toString method');
			}
			printName(){
				this.toString()
			}
			* add(){
				for(let i =0;i<10;i++) {
					yield i;
				}
			}
		}

静态属性

class中定义静态属性,使用static关键字

		class Person {
			static x = 0;
			constructor() {
				
			}
			getX(){
				console.log(Person.x);
			}
		}
		let person1 = new Person();
		person1.getX();

私有属性和私有方法

在之前还没有出现私有属性和公有属性我们约定变量名带_为私有属性和私有方法,这种方法现在也还是很流行

		class Person {
				
			constructor() {
				this._x=0;//私有属性
				this.y=0;//公有属性
			}
			getX(){
				console.log("公共方法");
			}
			_getY(){
				console.log("私有方法");
			}
		}

不过在es6中提出了一个方案使用#来声明私有属性和私有方法

		class Person {
			#x=0;
			constructor() {
				
				this.y=0;//公有属性
				this.#x++;//私有属性
			}
			getX(){
				console.log(this.#x);
				console.log("公共方法");
			}
			#getY(){
				console.log("私有方法");
			}
		}
		let person1 = new Person();
		console.log(person1.y);
		person1.getX(); //1
		console.log(person1.#x);//Uncaught SyntaxError: Private field '#x' must be declared in an enclosing class

new.target属性

new.target属性这个方法是用来构造函数,用来判断是否是使用new声明的构造函数或者调用Reflect.construct()可以用来限制我们只是new的方式来初始化实例

		function Person(){
			if(new.target !== undefined) {
				console.log("实例化");
			}else {
				console.log("必须实例化");
			}
		}
		let person = new Person();

在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
ES6中的class可以让我们更方便地定义类和面向对象的编程模式。下面是一些关于ES6 class的详细解释: 1. 定义类 使用class关键字定义一个类,类名通常首字母大写。例如: ``` class Person { constructor(name, age) { this.name = name; this.age = age; } sayHello() { console.log(`Hello, my name is ${this.name} and I'm ${this.age} years old.`); } } ``` 上面的代码定义了一个Person类,包一个构造函数和一个sayHello方法。 2. 构造函数 类中的构造函数使用constructor关键字定义,用于初始化对象的属性。例如: ``` class Person { constructor(name, age) { this.name = name; this.age = age; } } ``` 上面的代码定义了一个Person类,包一个构造函数,构造函数接收name和age两个参数,并将其分别赋值给对象的name和age属性。 3. 方法 类中的方法可以像普通函数一样定义,例如: ``` class Person { constructor(name, age) { this.name = name; this.age = age; } sayHello() { console.log(`Hello, my name is ${this.name} and I'm ${this.age} years old.`); } } ``` 上面的代码定义了一个Person类,包一个sayHello方法,该方法用于打印对象的name和age属性。 4. 继承 ES6中的class支持继承,使用extends关键字实现继承。例如: ``` class Student extends Person { constructor(name, age, grade) { super(name, age); this.grade = grade; } study() { console.log(`${this.name} is studying in grade ${this.grade}.`); } } ``` 上面的代码定义了一个Student类,该类继承自Person类,包一个构造函数和一个study方法。构造函数接收name、age和grade三个参数,其中name和age由父类的构造函数初始化,grade由子类的构造函数初始化。 5. 静态方法 类中的静态方法使用static关键字定义,可以直接通过类名调用,例如: ``` class MathUtils { static add(x, y) { return x + y; } static subtract(x, y) { return x - y; } } ``` 上面的代码定义了一个MathUtils类,包两个静态方法add和subtract,这两个方法可以直接通过类名调用。 6. 属性 ES6中的class支持定义属性,可以使用get和set关键字定义属性的读写方法。例如: ``` class Person { constructor(name, age) { this._name = name; this._age = age; } get name() { return this._name; } set name(name) { this._name = name; } get age() { return this._age; } set age(age) { this._age = age; } } ``` 上面的代码定义了一个Person类,包两个属性name和age,这两个属性的读写方法分别由get和set关键字定义。注意,属性名前面加上了一个下划线,这是一种约定俗成的做法,用于表示私有属性,防止属性被直接访问。 7. 静态属性 ES6中的class支持定义静态属性,使用static关键字定义静态属性。例如: ``` class MyClass { static myStaticProperty = 42; } ``` 上面的代码定义了一个MyClass类,包一个静态属性myStaticProperty,该属性的初始值为42。 总结: ES6中的classJavaScript提供了更加完整和规范的面向对象编程模式,支持继承、静态方法、属性等等。使用class可以让我们更方便地定义类和对象,提高代码的可读性和维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值