es6真正的引入的面相对象的,以前我们总是通过其他手段来模拟这种形式,现在终于有了,我有点开心,又有点难过,因为在我看来,js并不是所谓的面相对象的语言,反而更偏向函数式,原型继承是他真正的面目。面相对象不过是人们在思考问题时总结出一套有效的、大家都认同的解决问题的思路。在其他语言、各种领域取得成功之后,又将这种思想带入js中,为的是将已有的经验可以复用到js,从而更有效的解决js中的问题。

的确,面相对象是一个很有用的思考模块,在分解真实世界、大型项目的维护上有很大的好处,但是却缺少了函数式的灵巧。曾经想用完全面向对象的方式写一个redux,却发现无法用这种方式写出compose这种神奇的东西。

或许是我还没能在面相对象和函数式之间取得一种平衡,以取得面相对象和函数式共同的优点。

0x001 类

普通的类

  • 普通的类

    class Person{}
  • 类表达式

// 匿名类

let Person=class{}

// 具名类

let Person=class Person{}

0x001 初始化类和构造函数

   实例化类
    可以使用new来调用一个类,从而实例化一个类实例

  • class Person{}
    new Person() // Person{}
  • 构造函数
      使用new实例化一个类实例之后,将会自动调用该类的构造函数constructor,并且可以传递参数

        class Person{
    constructor(name, age){
    console.log(name, age)
    }
    }
    new Person("jack", 23) // 'jack', 23

    类变量
    类中可以保存一些变量,在类中,可以通过this.variable_name来访问,在类外,可以通过instance_name.variable_name只有类实例可以访问他们,并且每个类实例的变量都是属于每个类实例的。

    class Person {
    constructor(nickname, age){
    this.nickname = nickname
    this.age = age
    }
    }
    console.log(Person.nickname) // undefined
    console.log(Person.age) // undefined let person=new Person("jack",23)
    console.log(person.nickname) // 'jack'
    console.log(person.age) // let person2=new Person("maria",11)
    console.log(person2.nickname) // 'maria'
    console.log(person2.age) //

    类方法
    类方法是定义在类内部的函数,可以在类内部调用:this.function_name(params),也可以在实例上调用:instance_name.function_name(params)

    class Person{
    constructor(nickname, age){
    this.nickname = nickname
    this.age =age
    }
    getNickname(){
    return this.nickname
    }
    getAge(){
    return this.age
    }
    summary(){
    return `${this.nickname}:${this.age}`
    }
    }
    let person=new Person('jack', 23)
    console.log(person.getNickname()) // ''jack
    console.log(person.getAge()) //
    console.log(person.summary()) // 'jack:23'

    静态方法
    静态方法是可以通过类直接调用的方法,不需要实例化

    class Person{
    static sayHello(){
    console.log('hello')
    }
    }
    Person.sayHello() // 'hello'

    继承

    继承就是将父类所有的方法和都继承下来,包括构造函数

    class Person{
    constructor(nickname, age){
    this.nickname = nickname
    this.age =age
    }
    getNickname(){
    return this.nickname
    }
    getAge(){
    return this.age
    }
    summary(){
    return 'this is Person'
    }
    }
    class Male extends Person {}
    let male=new Male('jack',23)
    console.log(male.nickname) // 'jack'
    console.log(male.age) //
    console.log(male.getNickname()) // 'jack'
    console.log(male.getAge()) //
    console.log(male.summary()) // 'this is Person'
    class Far {
    constructor(x, y) {
    this.x = x;
    this.y = y;
    }
    sum() {
    console.log(this.x + this.y);
    }
    } class Jc extends Far {
    constructor(x, y) {
    super(x, y);
    }
    } new Jc(1, 2).sum();

    0x003 重写

    有时候我们不希望一个函数的作用和父类一致,比如在上面的栗子中,male.summary()返回this is Person,不符合我们的逾期,我们希望返回this is Male,这个时候就可以用到重写,只要写一个和父类相同名字和函数就行了,甚至参数个数不一致也不影响

    class Person{
    constructor(nickname, age){
    this.nickname = nickname
    this.age =age
    }
    getNickname(){
    return this.nickname
    }
    getAge(){
    return this.age
    }
    summary(){
    return 'this is Person'
    }
    }
    class Male extends Person {
    summary(){
    return 'this is Male'
    }
    }
    let male=new Male()
    console.log(male.summary()) // this is Male

es6基础:类、继承、重写的更多相关文章

  1. C++基础——类继承中方法重载

    一.前言 在上一篇C++基础博文中讨论了C++最基本的代码重用特性——类继承,派生类可以在继承基类元素的同时,添加新的成员和方法.但是没有考虑一种情况:派生类继承下来的方法的实现细节并不一定适合派生类 ...

  2. ES6——class类继承(读书笔记)

    前言 我一定是一个傻子,昨天这篇文章其实我已经写好了一半了,但是我没有保存 这是学习ES6的过程,我没有系统的看完阮大大的书.零零散散的,很多功能知道,但是没有实际的用过 看了几遍,总是看前面几章,所 ...

  3. C++基础——类继承

    一.前言  好吧,本系列博客已经变成了<C++ Primer Plus>的读书笔记,尴尬.在使用C语言时,多通过添加库函数的方式实现代码重用,但有一个弊端就是原来写好的代码并不完全适用于现 ...

  4. java基础 类 & 继承

    类 在Java中,类文件是以.java为后缀的代码文件,在每个类文件中可以有多个类,但是最多只允许出现一个public类,当有public类的时候,类文件的名称必须和public类的名称相同,若不存在 ...

  5. 深入解析ES6 更易于继承的类语法的使用

    和其它面向对象编程语言一样,ES6 正式定义了 class 类以及 extend 继承语法糖,并且支持静态.派生.抽象.迭代.单例等,而且根据 ES6 的新特性衍生出很多有趣的用法. 一.类的基本定义 ...

  6. 实现Square类,让其继承自Rectangle类,并在Square类增添新属性和方法,在2的基础上,在Square类中重写Rectangle类中的初始化和打印方法

    实现Square类,让其继承自Rectangle类,并在Square类增添新属性和方法,在2的基础上,在Square类中重写Rectangle类中的初始化和打印方法 #import <Found ...

  7. Python基础(十一) 类继承

    类继承: 继承的想法在于,充份利用已有类的功能,在其基础上来扩展来定义新的类. Parent Class(父类) 与 Child Class(子类): 被继承的类称为父类,继承的类称为子类,一个父类, ...

  8. C#基础--类/接口/成员修饰符,多态、重载、重写,静态和非静态

    C#基础--类/接口/成员修饰符,多态.重载.重写,静态和非静态 类/接口/成员修饰符 C#修饰符---接口: 接口默认访问符是internal接口的成员默认访问修饰符是public C#修饰符--类 ...

  9. ES6中的类继承和ES5中的继承模式详解

    1.ES5中的继承模式 我们先看ES5中的继承. 既然要实现继承,首先我们得要有一个父类. Animal.prototype.eat = function(food) { console.log(th ...

  10. 创建线程的一般方式和匿名内部类方式对比——继承thread类,重写run()方法

    第一种:继承thread类,重写run()方法 一般方式:Demo01.java /** * 创建线程的第一种方式:继承thread类,重写run()方法 * * @author :liuqi * @ ...

随机推荐

  1. 震惊,某博主为吸引眼球拿出压箱底SQL总结,如果你没看那就吃亏了!(超级详细的SQL基础,你还不会的话就别学数据库了)

    这里还有数据库相关的优质文章:快戳我,快戳我

  2. 数学--数论--HDU 4675 GCD of Sequence(莫比乌斯反演+卢卡斯定理求组合数+乘法逆元+快速幂取模)

    先放知识点: 莫比乌斯反演 卢卡斯定理求组合数 乘法逆元 快速幂取模 GCD of Sequence Alice is playing a game with Bob. Alice shows N i ...

  3. 自动化API之一 生成开源ERP Odoo App 的RestFul API

    1.在服务器上安装开源ERP Odoo 安装步骤请自行百度,本文重点不在于指导安装,以下是安装后PC端效果. Odoo: 2.在Uniconnector平台上注册Odoo App 移动端应用 3.配置 ...

  4. 使用python实现模拟掷骰子数据分析

    Data:2020/4/8 主题:模拟实现掷骰子数据分析 编译环境:pycharm 库:pygal 说明: code 1:创建一个掷骰子类对象,类方法获得掷骰子随机数1-6,默认6个面,模拟20次将结 ...

  5. django 整理数据库文档时,从mysql导出的表中没有注释的解决方案

    公司要将Django项目重构成Java项目,也就有了整理数据库文档的经历....... 由于django从model迁移时没有将注释(也就是模型类中的verbose_name)写进mysql的表中,导 ...

  6. JUC之CAS

    CAS(全称为CompareAndSwap,也有说是CompareAndSet,都差不多)是一条CPU并发原语,它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,判断预期值和更改新值的 ...

  7. (三)Redis &分布式锁

    1 Redis使用中的常见问题和解决办法 1.1 缓存穿透 定义:缓存系统都是按照key去缓存查询,如果不存在对应的value,就应该去DB查找.一些恶意的请求会故意查询不存在的key,请求量很大,就 ...

  8. LeetCode--Jewels and Stones && Range Sum of BST (Easy)

    771. Jewels and Stones (Easy)# You're given strings J representing the types of stones that are jewe ...

  9. 图形学_Bezier曲线

    Bezier曲线由n个控制点生成,举个例子:当n=2时,点$P_0$.$P_1$之间遵从计算: $P_0=(1-t)P_0+tP_1$ 而推广为n维时,有: $P^n_0=(1-t)P^{n-1}_0 ...

  10. Pytest 单元测试框架

    1.pytest 是 python 的第三方单元测试框架,比自带 unittest 更简洁和高效 2.安装 pytest pip install pytest 3.验证 pytest 是否安装成功 p ...