es6之class

Posted iszhangjin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了es6之class相关的知识,希望对你有一定的参考价值。

 

一、简介

  es6之前,生成实例对象的传统方法是通过构造函数,这里的构造函数包括自己声明的构造函数,也包括原生构造函数。(自己声明的构造函数函数名要大写);

function Parent(name, age) 
    this.name = name;
    this.age = age;            


let parent1 = new Parent(‘mark‘, 16);

let arr = new Array(1,2,3)

  es6提供了更接近传统面向对象语言的写法,引入了Class这个概念。通过Class关键字,可以定义类,可以看作是语法糖。与构造函数不同的是,类必须使用new 调用,否则会报错。

// 等同于上面
class Parent 
    constructor(name, age)
         this.name = name;
         this.age = age;
    

// 与构造函数一致
typeof Parent // ‘function‘
Parent.prototype.constructor === Parent;

  constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法,如果类中没有显式定义时,一个空的constructor会默认添加。

  constructor方法默认返回实例对象(即this),可以显示指定返回其他数据。当显式返回引用类型时,则new调用后得到该引用类型数据;当显式返回基本类型时,还是会得到默认的实例对象。与构造函数行为一致。

class Foo 
    constructor(name, age) 
         this.name = name;
         this.age = age;
         return [1,2,3]
    


let foo = new Foo(‘mark‘, 16);
foo // [1,2,3]

class Foo2 
    constructor(x, y) 
         this.x = x;
         this.y = y;
         return 1;
    


let foo2 = new Foo2(1,2);
foo2 // x: 1, y: 2

  类的实例:实例的属性,除了显式定义在constructor方法中的this上,还可以直接在类中定义(使用赋值定义的属性或方法都将定义在实例上),否则都是定义在原型上。

class Demo 
    name = ‘Demo‘;
    props = name: ‘props‘
    sayHello2 = () => 
        console.log(this.x, ‘instance-arrow-func‘)
    
    sayHello3 = function() 
        console.log(this.x, ‘instance-function‘)
    
    constructor(x, y) 
        this.x = x;
        this.y = y;
    
    
    sayHello() 
        console.log(this.x, ‘sayHello-prototype‘)
        console.log(‘Hello‘);
    

let demo = new Demo(1,2); // name,props、sayHello2、sayHello3都将与x、y一样是定义在实例上的
const sayHello, sayHello2, sayHello3 = demo;

  在这里一般会使用箭头函数定义实例方法,避免this指向改变的错误。

  注意:实例方法和属性都不会继承。(这里的继承是指原型继承。即不会出现在子类的原型上,但还是会子类实例上)

二、静态方法

  类相当于实例的原型,所有在类中定义的方法,其实都是定义在类的原型对象上了,这些方法都会被实例继承。如果在某个方法前加上 static 关键字, 则表示该方法不会被实例继承,而是直接通过类来调用,称之为“静态方法”;静态方法可以看作是定义在构造函数(函数是特殊的对象)这个对象上的一个方法。

  实例调用某方法时首先在实例本身查找,找不到时再到原型上查找。不会到原型的constructor上去查找,所以实例不能调用静态方法。

  

class Foo2 
    static staticMethod() 
        console.log(‘static-func‘)
    
    
    instanceMethod = () => 
        console.log(‘instance-func‘)
    
    
    prototypeMethod() 
        console.log(‘prototype-func‘)
    

技术图片

  注意:如果静态方法中包含this关键字,这个this指的是类,而不是实例。父类的静态方法,可以被子类继承。

  静态属性指的是Class本身的属性。

class MyClass 
     static myName =‘MyClass‘  


MyClass.myName;  // MyClass

三、new.target属性

  es6为new命令引入了一个new.target属性,该属性用于构造函数之中,返回new命令调用的那个构造函数,如果构造函数不是通过new命令或者Reflect.constructor()调用的,new.target会返回undefined,所以new.target可以确定构造函数是怎么调用的。

  子类继承父类时,new.target会返回子类。可以利用这个特点写出不能独立使用,必须继承后才能使用的类。

 四、静态方法+静态属性;实例方法+实例属性;原型方法+原型属性

  其中静态方法/属性是定义在构造函数这个对象上的方法/属性,构造函数可以直接调用,实例不能调用

  实例方法/属性是 new 构造方法生成实例后,在实例上定义的方法或属性;

  原型方法/属性是定义在构造函数的原型对象上的方法/属性,当实例本身找不到某个方法时,会沿着原型链在原型上查找。

以上是关于es6之class的主要内容,如果未能解决你的问题,请参考以下文章

ES6 之 解构赋值

ES6之命令妙用

ES6之let(理解闭包)和const命令

ES6之module

ES6 之 let / const

ES6新特性之模板字符串