码迷,mamicode.com
首页 > 其他好文 > 详细

Class

时间:2016-06-05 01:07:54      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:

一、语法   

  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);
    }
  }
}

 

Class

标签:

原文地址:http://www.cnblogs.com/realsoul/p/5559842.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!