美文网首页
ES6之Class

ES6之Class

作者: 芒僧 | 来源:发表于2017-04-02 11:30 被阅读0次

基本写法

class myObj {
    constructor(arg1,arg2){
        this.arg1 = arg1;
        this.arg2 = arg2; //这是该对象的属性,this指向myObj本身
    } // 这是类的构造函数
    
    myMethod () {
        ...doSomeThing 
    } //这是对象的方法
}

//调用时

let obj = new myObj(arg1,arg2) // 传入的arg1,arg2将自动绑定到构造函数的属性上

ES6的class语法基本上就是基于以前ES5构造函数的包装函数,也可以叫做语法糖,所有的功能都能用ES5做到,值得注意的是Class不存在变量提升,所以得先构造类,再进行类的实例化

再谈_proto_prototype

第一,从变量名就可以看出,一个是私有(不愿意公开)的变量,一个是显式的变量
所以_proto_又叫隐式原型prototype又叫显示原型

  • _proto_隐式原型指向创建这个对象的函数(constructor)的prototype, 关键词 to the value of its constructor’s "prototype",所以由一个类实例出来的多个对象的_proto_属性都是指向class里构造函数的prototype属性的。
  • prototype指向实例本身的prototype属性

个人理解

使用_proto_是为了实现方法的继承(children 全部 继承自同一个parent),而使用prototype是为了实现属性的自定义(修改单个实例中的属性不会修改到所有的)

请仔细看下图

Class的继承

class a extends b {} 表示 a继承b (b是父,a是子)


   class Human {
      constructor (name,age) {
        this.name = name // this指向Class 本身
        this.age = age
      } // constructor 就是构造函数
      sayName () {
        alert(this.name) // 调用对象里的属性
      }
      sayAge () {
        alert(this.age)
      }
    }
    //下面的Student继承自Human
    class Student extends Human {
      constructor (name,age,id){ //这里必须传入name,age 不然实例化出来的对象没法设置name和age
        super(name,age) //调用父类中的 构造函数
        this.id = id //自定义子类的属性
      }
      sayId () {
        alert(this.id)
      }
    }

    let yzy = new Student('yzy','23','1513011')
    yzy.sayId() //1513011
    yzy.sayName() //yzy
    yzy.sayAge()  // 23

值得注意的是必须在构造函数里面调用super关键词,因为子类里面没有创建this,必须得调用父类的this并做加工才能实现继承。如果不调用super方法,子类就没有this对象

关注原型链

如上图代码有

Student._proto_=== Human // true

Student.prototype._proto_ === Human.prototype //true

getter和setter

gettersetter 关键字可以对某个属性设置存值和取值函数,例如

  class myGetSet {
    constructor() {
      this.props = 'default'
    }

    get getProp() {
      return 'getter:' + this.props
    }

    set setProp(val) {
      this.props = val
      console.log('set:' + val)
    }
  }

get/set 是关键字

getProp函数返回了对象的props属性值

setProp函数可以传参数设置props的值

至于get/set的好处

可以参考

http://stackoverflow.com/questions/1568091/why-use-getters-and-setters 英文

https://www.zhihu.com/question/21401198 中文(知乎)

具体总结以下几点

  • 可以在存值和取值的时候增加其他功能(验证,计算值处理,算数表达式等)
  • 可以保持外部接口不变的情况下,修改内部存储方式和逻辑
  • 任意管理变量的生命周期和内存存储方式
  • 提供一个debug接口
  • 能在读写数据的时候下断点
  • 允许继承者改变语义
  • getter和setter可以有不同的访问级别

(部分摘自知乎)

静态属性和静态方法

静态的方法是绑定在上面的,不会被实例继承,也就是说实例调用不到静态方法,静态方法的this是指向类本身,所以可以直接通过类调用。静态属性的定义也基本如此。

相关文章

  • 原型与原型链

    关键字 prototype constructor __proto__ Object 在没有ES6的Class之...

  • ES6 class与继承

    class是什么 class是定义类的方法。ES6之前用构造函数的方式定义类,ES6引入了class。 class...

  • ES6之class

    class介绍 ES6之前,我们只能通过构造函数来生成实例对象。 这种写法个人认为有些麻烦,新手不太能理解(尤其是...

  • ES6之class

    解决的问题 更加清晰的书写继承,面向对象编程 基本语法 constructor 构造方法,this关键字代表构造对...

  • ES6之Class

    基本写法 ES6的class语法基本上就是基于以前ES5构造函数的包装函数,也可以叫做语法糖,所有的功能都能用ES...

  • ES6之class

    class基本语法: 1.实质: ​ class只是一个语法糖,类的所有方法都定义在类的prototype...

  • ES6之Class

    参考地址:http://es6.ruanyifeng.com/#docs/class 本节缺少实战与深刻理解,本节...

  • 手写乞丐版的Promise

    使用es6,class手写promise class NewPromise { constructor(exe...

  • 2JavaScript设计模式--class/extends

    ES6语法 类 class ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板...

  • 深入理解JS面向对象 - JavaScript实现继承的五种方式

    一、类与实例 1. 类的声明 传统function类的声明 ES6中的class声明 1.1 ES6 class与...

网友评论

      本文标题:ES6之Class

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