zoukankan      html  css  js  c++  java
  • Class

    一、语法   

      1、仅仅是语法上更像一些高级面向对象的语言(如Java)  本质上还是function对象  无法直接调用  需要创建实例

      2、类的内部所有定义的方法,都是不可枚举的  //使用function是可枚举的

      3、类的属性名可以采用表达式

      4、constructor:

    • 类的默认方法
    • 如果没有显式定义,一个空的constructor方法会被默认添加。
    • constructor方法默认返回实例对象(即this),完全可以指定返回另外一个对象。

      5、类的实例对象:

    • 不能像函数对象一样直接调用
    • 实例的属性除非显式定义在其本身(即定义在this对象上),否则都是定义在原型上(即定义在class上)
    • 所有实例共享一个原型对象

      6、prototype和__proto__

    • 每个构造器方法都有一个prototype属性,该属性是在定义构造器方法时自动创建的
    • prototype属性代表该函数创建的类的默认属性值,任何该类的新实例都可以使用这些方法
    • 类的每一个实例都有一个__proto__属性,用于引用创建它的构造器方法prototype属性,__proto__最终还是通过prototype才能实现其功能
    • prototype.__proto__表示方法的继承,总是指向父类的prototype属性。

      7、Class表达式:

    const MyClass = class Me {
      getClassName() {
        return Me.name;
      }
    };
    • Me可以省略
    • Me只能在类的内部使用  代指该类
    • 类名是MyClass
    • 立即执行类:const now=new class{....}([args...]);  //now就是新实例

      8、不存在变量提升

      9、ES6实际上把整个语言升级到了严格模式,不需使用"use strict"指定运行模式

     10、下面依次是用function关键字、class关键字创建的一个相同的类  //后者无法直接调用构造方法,必须借助new关键字

        

      

    二、Class的继承

      1、语法

    class Child extends Parent {}

      2、super关键字表示父类的构造函数,用来新建父类的this对象

      3、子类必须在constructor方法中调用super方法,这是因为子类没有自己的this对象,而是继承父类的this对象,如果不调用super方法,子类就得不到this对象

      3、注意:

    • Class类不能使用prototype属性添加其他属性  但可以使用prototype.__proto__添加其他属性  //prototype被内部占用  用来存放所有的属性和方法(除了对象本身的方法外)
    • Class的子类既不能使用prototype属性添加其他属性  也不能使用prototype.__proto__属性添加其他属性  //prototype.__proto__被内部占用,指向父类的prototype属性

      4、Extends 的继承目标

    • 只要是一个有prototype属性的函数,就能被B继承。由于函数都有prototype属性,因此A可以是任意函数。
    • 子类继承Object类:class A extends Object {}  //A其实就是构造函数Object的复制,A的实例就是Object的实例
    • 不存在任何继承:class A {}  //A作为一个基类(即不存在任何继承),就是一个普通函数,所以直接继承Funciton.prototype但是,A调用后返回一个空对象(即Object实例),所以A.prototype.__proto__指向构造函数(Object)的prototype属性
    • 子类继承null:class A extends null {}  //A也是一个普通函数,所以直接继承Funciton.prototype。但是,A调用后返回的对象不继承任何方法,所以它的__proto__指向Function.prototype,即实质上执行了下面的代码。
    class A extends null {
      constructor() { return Object.create(null); }
    }

      5、Object.getPrototypeOf(child) ;  //返回父类

      6、实例的__proto__属性

    • 子类实例的__proto__属性的__proto__属性,指向父类实例的__proto__属性。也就是说,子类的原型的原型,是父类的原型
    • 通过子类实例的__proto__.__proto__属性,可以修改父类实例的行为

    三、原生构造函数的继承

      1、ECMAScript的原生构造函数大致有下面这些:

    • Boolean()
    • Number()
    • String()
    • Array()
    • Date()
    • Function()
    • RegExp()
    • Error()
    • Object()

      2、ES5和ES6继承的区别

    • ES5是先新建子类的实例对象this,再将父类的属性添加到子类上,由于父类的内部属性无法获取,导致无法继承原生的构造函数
    • ES6是先新建父类的实例对象this,然后再用子类的构造函数修饰this,使得父类的所有行为都可以继承
    • ES6改变了Object构造函数的行为,一旦发现Object方法不是通过new Object()这种形式调用,ES6规定Object构造函数会忽略参数。

      3、Class的取值函数(getter)和存值函数(setter)

      4、Class的Generator方法

      5、Class的静态方法

    • 类相当于实例的原型,所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”
    • 父类的静态方法,可以被子类继承
    • 静态方法也是可以从super对象上调用的

      6、Class的静态属性和实例属性

    class Foo {}
    Foo.prop = 1;    //静态属性    
    Foo.prop // 1
    • 静态属性指的是Class本身的属性,即Class.propname,而不是定义在实例对象(this)上的属性。
    • ES6明确规定,Class内部只有静态方法,没有静态属性。

      7、new.target属性

    • new是从构造函数生成实例的命令。ES6为new命令引入了一个new.target属性,(在构造函数中)返回new命令作用于的那个构造函数。如果构造函数不是通过new命令调用的,new.target会返回undefined
    • Class内部调用new.target,返回当前Class。
    • 子类继承父类时,new.target会返回子类,利用这个特点,可以写出不能独立使用、必须继承后才能使用的类。
    • 在函数外部,使用new.target会报错。

      8、Mixin模式的实现

    • Mixin模式指的是,将多个类的接口“混入”(mix in)另一个类。它在ES6的实现如下。
    function mix(...mixins) {
      class Mix {}
    
      for (let mixin of mixins) {
        copyProperties(Mix, mixin); //对象本身的属性和方法
        copyProperties(Mix.prototype, mixin.prototype); //原型链上的对象和方法
      }
    
      return Mix;
    }
    
    function copyProperties(target, source) {
      for (let key of Reflect.ownKeys(source)) {
        if ( key !== "constructor"
          && key !== "prototype"
          && key !== "name"
        ) {
          let desc = Object.getOwnPropertyDescriptor(source, key);
          Object.defineProperty(target, key, desc);
        }
      }
    }
    All rights reserved please indicate the source if reprint---吓尿了的大肥鼠
  • 相关阅读:
    PowerDNS简单教程(4):优化篇
    PowerDNS简单教程(3):管理篇
    PowerDNS简单教程(2):功能篇
    PowerDNS简单教程(1):安装篇
    【转】Linux vmstat命令实战详解
    折腾apt源的时候发生的错误
    Ubuntu14.04安装PowerDNS踩坑实录
    Ubuntu14.04.3,apt-get出现dpkg: error processing package xxx (--configure)和cups-daemon错误的解决方案
    Python解析配置文件模块:ConfigPhaser
    SSH异常处理(一)
  • 原文地址:https://www.cnblogs.com/realsoul/p/5559842.html
Copyright © 2011-2022 走看看