美文网首页
ES6——面向对象、类

ES6——面向对象、类

作者: 向上而活 | 来源:发表于2018-06-21 23:25 被阅读0次

注意:

1、ES6里面class没有提升功能,在ES5中,用函数模拟可以提升。

2、ES6里面this简单了。

先大概回顾一下之前都是如何面向对象的:

function Person(name,age){

    this.name=name;

    this.age=age;

}

 Person.prototype.showName=function(){

     return `我叫${this.name}`;

 }

 Person.prototype.showAge=function(){

     return `我今年${this.age}`;

 }

或者:

Object.assign(Person.prototype,{

    showName(){

        return `我叫${this.name}`;

    }

    showAge(){

        return `我今年${this.age}`;

    }

})

然后:

var  p1=new Person('yangyi','18');

console.log(p1.showName());

console.log(p1.showAge());

ES6是这样的:

class Person{//这其实也是一个函数 

    constructor(name,age){//构造方法 new时 自动执行

        this.name=name;

        this.age=age;

    }

    show(){

            return `我叫${this.name}今年${this.age}岁`;

        }

    }

let p1=new Person('yangyi',18);

console.log(p1.show());

也可以这样定义类:

const Person=class { ...}

ES6中属性名,可以是一个变量:

let a="aaa";

let b="bbb";

class Person{

        [a+b](){

            return'随便。。。';

        }

}

let p=new Person();

console.log(p.aaabbb());

class中的取值函数getter与存值函数setter:(多用于封装插件、模块等)

class Person{

    constructor(){}

    get aaa(){

        return `aaa的属性`;

    }

    set aaa(val){

       console.log(`设置aaa属性,值为:${val}`);

    }

}

let p=new Person();

p.aaa='123';//存值

console.log(p.aaa);//取值

class中的静态方法:用类的名字可以直接调用静态方法,若调用非静态方法,返回undefined。

class Person{

    constructor(){}

     showname(){

        return "这是showname方法";

    }

    static aaa(){

        return "这是静态方法";

    }

}

let p=new Person();

console.log(p.showname());//这是showname方法

console.log(Person.showname());//undefined

console.log(Person.aaa());//这是静态方法

静态方法也可以被子类继承,之前子类继承父类比较麻烦,大概是这样:

//父类

function Person(name){

    this.name=name;

}

Person.prototype.showname=function(){

    return `名字是${this.name}`;

}

//子类

function student(name,skill){

    Person.call(this);

    this.name=name;

    this.skill=skill;

}

student.prototype=new Person();//继承方法

//调用

let stu1=new student('yang','逃学');

console.log(stu1.showname());

console.log(stu1.name,stu1.skill);

ES6中继承比较简单:

//父类

class Person{

    constructor(name){

        this.name=name;

    }

    showname(){

        console.log("这是父类的showname");

        return `我叫${this.name}`

    }

}

//子类继承父类

class student extends Person{}//只继承父类,没有自己的东西

或者继承父类同时要写自己的东西:

class student extends Person{

    constructor(name,skill){

        super(name);//继承父类同时要写自己的东西时,一定要有这一步,意思是继承父类东西

        this.skill=skill;//子类自己的参数

    }

    showskill(){//子类自己的方法

        return `我的技能是${this.skill}`;

    }

//当子类中有与父类同名的方法时,调用子类的 showname(),会将父类中的 showname()覆盖掉。要想及执行子类中的 showname(),也执行父类中的 showname(),可以加入 super.showname(); 如下:

     showname(){

        super.showname();

        console.log("这是子类的showname");

    }

}

//调用

let stu1=new student('yang');

console.log(stu1.showname());

console.log(stu1.showskill());

相关文章

网友评论

      本文标题:ES6——面向对象、类

      本文链接:https://www.haomeiwen.com/subject/wascyftx.html