class

  1. ES6 提供了更加接近传统语言 **JavaC++** 的写法,引入了**Class(类)** 这个概念,作为对象的模板。通过 `class` 关键词,可以定义类。基本上,ES6 `class` 可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的 `class` 写法只是让对象原型的写法更加清晰、更加**面向对象编程**的语法而已。知识点:
  • class 声明类
  • constructor 定义构造函数初始化
  • extends 继承父类
  • super 调用父级构造方法
  • static 定义静态方法和属性
  • 父类方法可以重写

初体验:
  1. // 手机
  2. function Phone(brand, price) {
  3. this.brand = brand
  4. this.price = price
  5. }
  6. // 添加方法
  7. Phone.prototype.call = function() {
  8. console.log('我可以打电话')
  9. }
  10. // 实例化对象
  11. let Huawei = new Phone('华为',5999)
  12. Huawei.call()
  13. console.log(Huawei, typeof Huawei) // Phone {brand: "华为", price: 5999} "object"
  14. // class
  15. class Shouji {
  16. // 构造方法 名字不能修改
  17. constructor(brand, price) {
  18. this.brand = brand
  19. this.price = price
  20. }
  21. // 方法必须使用该语法,不能使用 ES5 的对象完整形式
  22. call() {
  23. console.log('我可以打电话')
  24. }
  25. }
  26. let onePlus = new Shouji('1+',1999)
  27. console.log(onePlus, typeof onePlus) // Phone {brand: "1+", price: 1999} "object"

静态成员:
  1. // function Phone() {
  2. //
  3. // }
  4. //
  5. // // 这两个属性是属于函数对象的,不属于实例对象,这些称为静态成员
  6. // Phone.name = '手机'
  7. // Phone.change = function () {
  8. // console.log('我可以改变你世界')
  9. // }
  10. // Phone.prototype.size = '5.5inch'
  11. // let nokia = new Phone()
  12. //
  13. // console.log(nokia.name)
  14. // // nokia.change()
  15. // console.log(nokia.size)
  16. class Phone {
  17. // 静态属性
  18. static name = '手机'
  19. static change() {
  20. console.log('我可以改变世界')
  21. }
  22. }
  23. let nokia = new Phone()
  24. console.log(nokia.name) // undefined
  25. console.log(Phone.name) // 手机
  26. // 对于 static 标注的属性是属性和方法,它是属于类而不属于实例对象

ES5的继承:
  1. // 手机
  2. function Phone(brand, price) {
  3. this.brand = brand
  4. this.price = price
  5. }
  6. Phone.prototype.call = function () {
  7. console.log('我可以打电话')
  8. }
  9. // 智能手机
  10. function SmartPhone(brand,price,color,size) {
  11. Phone.call(this,brand,price)
  12. this.color = color
  13. this.size = size
  14. }
  15. console.log(new Phone,typeof new Phone) // Phone {brand: undefined, price: undefined} "object"
  16. // 设置子级构造函数的原型
  17. SmartPhone.prototype = new Phone
  18. SmartPhone.prototype.constructor = SmartPhone
  19. // 声明子类的方法
  20. SmartPhone.prototype.photo = function () {
  21. console.log('我可以拍照')
  22. }
  23. SmartPhone.prototype.playGame = function () {
  24. console.log('我可以玩游戏')
  25. }
  26. const chuizi = new SmartPhone('锤子','2499','black','5.5inch')
  27. console.log(chuizi)

ES6类继承:
  1. class Phone {
  2. constructor(brand, price) {
  3. this.brand = brand
  4. this.price = price
  5. }
  6. call() {
  7. console.log('打电话')
  8. }
  9. }
  10. class SmartPhone extends Phone {
  11. // 构造方法
  12. constructor(brand, price, color, size) {
  13. super(brand, price); // Phone.call(this,brand,price)
  14. this.color = color
  15. this.size = size
  16. }
  17. photo() {
  18. console.log('拍照')
  19. }
  20. playGame() {
  21. console.log('玩游戏')
  22. }
  23. call() { // 子类对父类的方法重写
  24. super.call() // 子类调用父类的同名方法
  25. console.log('我可以视频通话')
  26. }
  27. }
  28. const xiaomi = new SmartPhone('小米','799','黑色','4.7inch')
  29. xiaomi.call()
  30. xiaomi.photo()
  31. xiaomi.playGame()
  32. console.log(xiaomi)

get和set:
  1. // get 和 set
  2. class Phone {
  3. get price() {
  4. console.log('价格属性被获取了')
  5. return 'iloveyou'
  6. }
  7. set price(newVal) {
  8. console.log('价格属性被修改了',newVal)
  9. }
  10. }
  11. // 实例化对象
  12. let s = new Phone()
  13. console.log(s.price)
  14. s.price = 'free'