要点:1.类class 2.getter 和 setter
一、类class
1.在ES6之前,JavaScript 不能像其它语言 (php,java)等有完整的类支持
2.我们采用了原型链实现了面向对象的功能,但从ES6开始,提供了真正的类语法
3.当然,虽然说是真的类语法,而本质上内部实现和原型链还是不一样的
4.创建一个基本的类,并创建构造函数(构造方法):
// 创建一个类 class Person{ // 构造函数(构造方法) constructor(name){ // this.name是类的属性 // name是构造参数赋值给属性 this.name=name; } //普通方法 run(){ console.log('类的方法输出!' +this.name); //类的方法输出!Mr.Lee } } // 实例化一个Person对象 let p=new Person('Mr.Lee'); // 执行run()方法; p.run(); // 输出对象的属性 console.log(p.name); //Mr.Lee // 判断p是否是Person对象 console.log(p instanceof Person); //true // 判断类的类型:function console.log(typeof Person); //function
5.ES6除了上面的class Person这种常规类的写法,ES6还支持表达式写法:
// NO.1 let Per=class Person{ // 构造函数(构造方法) constructor(name){ // this.name是类的属性 // name是构造参数赋值给属性 this.name=name; } //普通方法 run(){ console.log('类的方法输出!' +this.name); //类的方法输出!Mr.Lee } }; // 此时new Person会报错 let p=new Per('Mr.Lee'); p.run(); // No.2 let Person=class{}; // NO.3 let p=new class {}('Mr.Lee'); p.run();
二、getter 和 setter
1.根据面向对象的三大定律成员属性,我们需要对它进行封装,变成私有属性
2.目前的this.name,基本是对外公开的,可以在类外取值和赋值
3.当我们假设类的属性是私有的,那么需要通过 get() 和 set() 方法实现:
// 创建一个类 class Person{ #name; //提案,浏览器暂不支持 // 构造函数(构造方法) constructor(name){ this.#name=name; //私有属性,类外无法访问 } get name(){ return this.#name; //Me.Lee 读取 } set name(value){ this.#name=value+'123'; //Mr.Wang123 赋值 } } let p=new Person('Me.Lee'); p.name='Mr.Wang'; console.log(p.name);