美文网首页
19class的基本语法

19class的基本语法

作者: 我_巨可爱 | 来源:发表于2017-11-08 14:34 被阅读0次

    Class 是 es6 的语法糖,es5 也能通过其他方式实现

    基础

    let ss = "sayHi"
    class Fn {
      construct(x) {
        this.x = x
      }
      toString() {
      }
      [ss]() {
      }
    }
    Obeject.keys(Fn.prototype)
    Obeject.getOwnPropertyNames(Fn.prototype)
    typeof Fn // function
    Fn == Fn.prototype.construct  // true
    
    1. Class 内部的方法不使用 function
    2. 方法之间不使用;,否则,会报错
    3. 方法名可以使用变量
    4. 写在class内部的方法,不可枚举,因此,使用Object.keys无法获取
    5. 类的数据类型是Function, 类本身就指向构造函数
    6. 类中的方法,其实相当于写在原型上
    7. 这种形式,不存在变量提升

    construct

    1. 必须使用new
    2. 默认返回this实例对象,可以自定义返回对象return Object.create(null)

    类的实例对象

    1. 使用new
    2. 只有直接将属性定义在this, 那么这个属性才属于实例对象
    3. 所有类实例共享一个原型对象
    4. 获取圆形对象的方法
    • Fn.prototype
    • 实例对象fn.__proto__(会依赖环境)
    • 实例对象Object.getPrototypeOf(fn)
    // 实例对象属性
    var fn = new Fn(1)
    fn.hasOwnproperty('x')   // true
    // 实例对象原型
    var ff = new Fn(2)
    fn.__proto__  = ff.__proto__   // true
    

    小小知识点

    1. Object.getPrototypeOf(obj)
    • 当参数是字符串时,在es6中不会报错,回返回String.protptype

    Class 表达式

    const MyClass = class Me {
      sayHello() {
         console.log('Hello')
      }
    }
    MyClass.sayHello()
    MyClass.name // MyClass
    
    1. Me只能在类的内部使用
    2. 使用函数表达式可以构建直接使用的类
    3. 类有name属性

    私有方法

    有时,需要类有自己的私有方法,外部无法通过对象使用。有以下的解决方法

    1. 普通方法_say,下滑线。这只是规范约定,外部依旧可以获取fn._say
    2. 内部访问全局方法
    3. 使用 Symbol 值的唯一性
    let foo = Symbol('foo')
    class Fn {
      say() {
        // 只能内部使用
        this[foo]('1')
      }
      // 私有方法
      [foo](param) {}
    }
    

    私有属性

    提案,#表示私有属性和私有方法

    this指向

    将对象中的方法解构出来,容易出错。

    1. constructor中手动将this绑定到方法上
    2. 使用箭头函数
    3. 使用proxy

    回忆

    1. 箭头函数this引用外层this,并且不会改变
    2. proxy基本语法var pp = new Proxy(target,handler)

    Class 的取值函数和存值函数

    属性上可以设置

    class Fn {
      get prop() {
      }
      set prop(val) {
      }
    }
    var descriptor = Object.getOwnPropertyDescriptor(Fn.prototype,"prop")
    "get" in descriptor // true
    
    1. 取值函数和存值函数设置在属性的Descriptor对象上

    Class 的 Generator方法

    1. class中的方法前,添加一个*就是generator方法

    Class 的静态方法和静态属性

    静态方法

    1. 语法,方法名前添加一个static就是静态方法
    2. 静态方法不能被实例继承
    3. 静态方法可以被子类继承
    4. 静态方法中this指向的是当前类

    静态属性

    1. 只能通过Fn.prop的方式添加静态属性

    new.target 属性

    该属性一般是在构造函数中使用

    1. 有两个功能
    • 使得当前类必须使用new
    • 定义只能继承不能直接使用的类(有点像接口)
    1. 子类继承父类,创建子类实例时,new target指向子类
    2. 类不使用new,那么new.targetundefined
    class Parent {
      constructor(name) {
        if (new.target == Parent) {
          this.name = name;
        }else {
          throw New Error('必须使用new生成实例')
        }
      }
    }
    

    相关文章

      网友评论

          本文标题:19class的基本语法

          本文链接:https://www.haomeiwen.com/subject/bqsemxtx.html