前期提要:

   JavaScript 语言中,在使用类之前,生成实例对象的传统方法是通过使用构造函数。

一、构造函数:

  定义:通过  new 函数名  来实例化对象的函数叫构造函数。

    主要功能:为初始化对象,特点是和new 一起使用。new就是在创建对象,从无到有,构造函数就是在为初始化的对象添加属性和方法。

    注意:任何的函数都可以作为构造函数存在构造函数定义时首字母大写(规范)。

    对new的理解:new 申请内存, 创建对象,当调用new时,后台会隐式执行new Object()创建对象。所以,通过new创建的字符串、数字是引用类型,而是非值类型。

    1、常用的构造函数:

    • var arr = [];为 var arr = new Array()的语法糖

    • var obj = {}; 为 var obj = new Object()的语法糖

    • var date = new date()

    • 当然还有很多,这里就不一 一列举了。

  2、执行一个构造函数:

function A(name,age){   this.name = name;   this.age = age; }
A.prototype.info = function(){
  return "姓名"+ "" + this.name + "年龄" + this.age
}
let a = new A("张三",22)//实例化a
//打印 a结果
A{
  name:"张三",
  age:22
}
//打印 a.info() 结果为 "姓名张三年龄22"

二、class 类

    由来:因为上面构造函数的写法跟传统的面向对象语言差异很大,给很多程序员造成很多困惑,所以ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。

    通过class关键字,可以定义类。

   1、class类基本语法的使用

class A{
  constructor(){
    //成员属性
    this.name = name
    this.age = age
  }
  //静态方法 如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。A.nihao()
  static nihao(){
    console.log("你好")
  }
  //成员方法
  info(){
    return "姓名"+ "" + this.name + "年龄" + this.age 
  }
}

    与上面的构造函数相比之言,新的class写法让对象原型的写法更加清晰、更像面向对象编程的语法。

     注意:定义info()方法的时候,前面不需要加上function这个关键字,直接把函数定义放进去了就可以了,方法与方法之间不需要逗号分隔,加了会报错。

     添加静态属性:

        静态属性指的是 Class 本身的属性,即Class.propName,而不是定义在实例对象(this)上的属性。

     老式写法:

     class A{}

     A.props=1 //A.props= 1   props就是A的静态属性

     新式写法:

     class A{

      static props = 1

     }

    新写法是显式声明(declarative),而不是赋值处理,语义更好。

    私有方法私有属性

      私有方法两种写法:    

      function bar(name){

       return this.name = name

      }

      class A{

        foo(name){

          bar.call(this,name)

        }

        }

     这样写的原因是类内部的所有方法都是对外可见的。foo是公开方法,内部调用了bar.call(this, baz)。这使得bar()实际上成为了当前类的私有方法。

     还有一种方法是利用Symbol值的唯一性,将私有方法的名字命名为一个Symbol值。

     const bar = Symbol('bar')

        const  name = Symbol('name')

     class A{

      //公有方法

      foo(){

        this[bra](name)

      }

      //私有方法

      [bar](name){

          return this[name] = name

      }

     }

    私有属性

    第一种方法是在属性名之前,使用#表示。

    class A{

      #count = 0

    }

    注意:#count就是私有属性,只能在类的内部使用(this.#count)。如果在类的外部使用,就会报错。

      这种写法不仅可以写私有属性,还可以用来写私有方法。

    私有属性也可以设置 getter 和 setter 方法。

class Foo {
#a;
#b;
#xVal = 0;
constructor(a, b) {
this.#a = a;
this.#b = b;
}
#sum() {
return this.#a + this.#b;
}
printSum() {
console.log(this.#sum());
}

get #x() { return #xValue; }

set #x(value) {

this.#xValue = value;
}
}
私有属性不限于从this引用,只要是在类的内部,实例也可以引用私有属性。
私有属性和私有方法前面,也可以加上static关键字,表示这是一个静态的私有属性或私有方法。

  2、深入介绍class类和class继承

   <1>

     ES6 的类,完全可以看作构造函数的另一种写法。

class A{}  typeof A //function  A === A.prototype.constructor // ture 可以看出,类的数据类型就是函数,类本身就指向构造函数。

    使用的时候,也是直接对类使用new命令,跟构造函数的用法完全一致。

    <2>

    class A{

      constructor(){}

      info(){}

      toString(){}

      toVal(){}

    }

    等同于

    A.prototype={

      info(){},

      toString(){},

      toVal(){},

    };

    构造函数的prototype属性,在类里面也存在,类的所有方法都定义在类的prototype属性上面.

    因此,在类的实例上面调用方法,其实就是调用原型上的方法。

    <3>

    Object.assign()  方法可以很方便地一次向类添加多个方法。如下:

         Object.assign(A.prototype,{

      toString(){},

      toVal(){},

      })

    <4>

    类的内部所有定义的方法,都是不可枚举的,如下:

class A{
constructor(x, y) {
// ...
}
toString() {
// ...
}
}
Object.keys(A.prototype)
// []
<5>

    类内部可以忽略不写constructor,因为JavaScript 引擎会自动为它添加一个空的constructor()方法。如下:

    class A{} === class A{constructor(){}} //true

    <6>

    constructor()方法默认返回实例对象(即this),完全可以指定返回另外一个对象。

    <7>

    类必须使用new调用,否则会报错。这是它跟普通构造函数的一个主要区别,后者不用new也可以执行。

    继承:

      <1>class 通过extends关键字实现继承,这样的继承方式非常清晰和方便

        class A{}

        class B extends A{

          constructor(){

            super() //关键字,super作为函数调用时,代表父类的构造函数

          }

        } //B类继承了A类的所有属性和方法

      <2>Object.getPrototypeof(B)=== A //true 方法可以用来从子类上获取父类 ,因此,可以使用这个方法判断,一个类是否继承了另一个类。

        

        

ES6语法:class类,从了解到使用的更多相关文章

  1. es6 语法 (类与对象)

    { // 基本定义和生成实例 class Parent{ constructor(name='mukewang'){ this.name=name; } } let v_parent1=new Par ...

  2. ES6语法~解构赋值、箭头函数、class类继承及属性方法、map、set、symbol、rest、new.target、 Object.entries...

    2015年6月17日 ECMAScript 6发布正式版本 前面介绍基本语法,  后面为class用法及属性方法.set.symbol.rest等语法. 一.基本语法:  1.         定义变 ...

  3. Nodejs与ES6系列4:ES6中的类

    ES6中的类 4.1.class基本语法 在之前的javascript语法中是不存在class这样的概念,如果要通过构造函数生成一个新对象代码 function Shape(width,height) ...

  4. ES6中的类

    前面的话 大多数面向对象的编程语言都支持类和类继承的特性,而JS却不支持这些特性,只能通过其他方法定义并关联多个相似的对象,这种状态一直延续到了ES5.由于类似的库层出不穷,最终还是在ECMAScri ...

  5. 把JavaScript代码改成ES6语法不完全指南

    目录 * 核心例子 * 修改成静态变量(const)或块级变量(let) * 开始修改 * 疑问解释(重复定义会发生什么) * 疑问解释(let的块级作用域是怎样的) * 疑问解释(const定义的变 ...

  6. 深入理解ES6之——JS类的相关知识

    基本的类声明 类声明以class关键字开始,其后是类的名称:剩余部分的语法看起来像对象字面量中的方法简写,并且在方法之间不需要使用逗号. class Person { //等价于prototype的构 ...

  7. ES6语法的学习与实践

    ES6是JavaScript语言的新一代标准,是ECMAScript的第六个版本,加入了很多新的功能和语法,在很多框架,如在使用Vue,React等框架的项目中一般都采用ES6语法来编写的,下面对经常 ...

  8. ES6中的类和继承

    class的写法及继承 JavaScript 语言中,生成实例对象的传统方法是通过构造函数.下面是一个例子     function Point(x, y) {  this.x = x;  this. ...

  9. ES6语法知识

    let/const(常用) let,const用于声明变量,用来替代老语法的var关键字,与var不同的是,let/const会创建一个块级作用域(通俗讲就是一个花括号内是一个新的作用域) 这里外部的 ...

  10. es6语法快速上手(转载)

    一.相关背景介绍 我们现在大多数人用的语法javascript 其实版本是ecmscript5,也是就es5.这个版本己经很多年了,且完美被各大浏览器所支持.所以很多学js的朋友可以一直分不清楚es5 ...

随机推荐

  1. 华为交换机eNSP删除Vlan的详细步骤

    设备支持批量删除VLAN和单个删除VLAN两种方式: 单个删除VLAN10 <HUAWEI> system-view [HUAWEI] undo vlan 10 批量删除VLAN10到VL ...

  2. C和指针课后练习题3

    1.在你的机器上,字符的范围有多大?有那些不同的整数类型以及他们的范围? C语言中数据输入输出格式: %d 有符号10进制整数%i 有符号10进制整数%o 无符号8进制整数%u 无符号10进制整数%x ...

  3. Beta冲刺随笔——Day_Eight

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta 冲刺 这个作业的目标 团队进行Beta冲刺 作业正文 正文 其他参考文献 无 今日事今日毕 林涛: ...

  4. Flv.js记录(vue)

    下载 npm install flv.js 插入 import flvjs from 'flv.js'   第一种报错:Failed to read the 'buffered' property f ...

  5. java并发编程实战《三》互斥锁(上)

    互斥锁(上):解决原子性问题 原子性问题的源头是线程切换,操作系统做线程切换是依赖 CPU 中断的,所以禁止 CPU 发生中断就能够禁止线程切换. 在早期单核 CPU 时代,这个方案的确是可行的,而且 ...

  6. Django链接mysql数据库报错1064

    D:\PycharmProjects\autotest>python manage.py makemigrations django.db.utils.ProgrammingError: (10 ...

  7. MySQL入门看这一篇就够了

    MySQL JavaEE:企业级Java开发 web阶段 分为1.前端(页面,展示数据库中的数据) 2.后台(连接点:链接数据库JDBC.Mybatis,链接前端(控制视图跳转,给前端传递数据)) 3 ...

  8. 第 4篇 Scrum 冲刺博客

    一.站立式会议 1.站立式会议照片 2.昨天已完成的工作 登录信息的匹配 3.今天计划完成的工作 ①售货员页面功能 ②销售排行 4.工作中遇到的困难 ①页面按钮太过复杂,逻辑错乱 ②有的同学数据库驱动 ...

  9. JOISC2020 自闭记

    以下是我考场上的思路,很多题都不是正解.对于某些题目,我们使用<代码部落>中的题解,希望大家能够看懂 JOISC2020 Round1 自闭记 T1 11 pts 算法:考虑\(DP\). ...

  10. CSP-S2020初赛游记

    前一星期 感觉没怎么复习初赛啊,经常旷初赛练习赛--整天刷复赛题被老师怒斥了. zhoukangyang 天天做初赛(但是一天还是稳定做 \(2\) 道黑题),是不是要 AK 了啊(慌... 前一天 ...