【学习笔记】ES6 标准 - 类(class)和继承

2019-06-20  本文已影响0人  Spidd
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>类(class)和继承</title>
    <script type="module">

        /*----------类(class)和继承-----------*/
        /*面向对象理解
         * ---人--- Person
         * 属性:name,
         * 方法:getName,
         * */

        // ES6之前-----------
        {
            function Person(name, age){
                this.name = name;
                this.age = age
                this.getName = function () {
                    return this.name
                }
            }
            // Person.prototype.showName = function(){
            //   return `名字为:${this.name}`
            // };
            // Person.prototype.showAge = function(){
            //     return `名字为:${this.age}`
            // };

            //【Object.assign】合并对象
            Object.assign(Person.prototype,{
               showName(){
                   return `名字为:${this.name}`
               },
                showAge(){
                    return `名字为:${this.age}`
                }
            });

            let person = new Person('奶牛', 2);
            console.log(person.showName())
            console.log(person.showAge())
        }

        // ES6类变形
        /*
        * 【重点】属性名可以放表达式(或者变量),只要它能执行
        * 【注意】class 没有提升
        * */
        {
            // const Person = class{}
            let name = 'showName';
            class Person
            {
                constructor(name, age){ //构造方法(函数) 当前类被new时 自动执行
                    console.log(`构造函数执行了。 ${name}, ${age}`)
                    this.name = name;
                    this.age = age;
                }
                [name](){
                    return `名字为${this.name}`
                }
            }
            let p1 = new Person('奶牛', 18);
            console.log(p1)
            console.log(p1[name]())
        }

        // 矫正this
        /*
        * fn.call(this指向谁, args1,args2.....)
        * fn.apply(this指向谁, [args1,args2....])
        * fn.bind() //es5新增
        * */
        {
            class Person
            {
                constructor(){ //构造方法(函数) 当前类被new时 自动执行
                    this.name = '奶牛';
                    this.showName = this.showName.bind(this); // 矫正this.
                }
                showName(){
                    return `名字为${this.name}`
                }
            }
            let p1 = new Person();
            let { showName } = p1;
            console.log(showName());
        }

        // set 监听 设置的值  get 监听 取值
        {
            class Person
            {
                constructor(){ //构造方法(函数) 当前类被new时 自动执行
                }
                get getA(){
                    console.log('456')
                    return this.a
                }
                set setA(val){
                    console.log(this)
                    this.a = val
                }
            }
            let p1 = new Person();
            p1.setA = 123;
            console.log(p1.getA)
        }

        // 静态方法 static (类身上方法,原型上的方法,会继承到子类上。)
        /*
        * */
        {
            class Person
            {
                constructor(){ //构造方法(函数) 当前类被new时 自动执行
                }
                showName(){
                    return `这是showName方法`;
                }
                static aaa(){
                    return `这是静态方法aaa;`
                }
            }
            let p1 = new Person();
            console.log(Person.aaa());  //父类调用

            // ES6之前的继承
            {
                function Person(name) {
                    this.name = name;
                }
                Person.prototype.showName = function () {
                   return `名字为:${this.name}`;
                }
                function Student(name, skill) {
                    Person.call(this,name); // 继承 属性
                    this.skill = skill;
                }
                Student.prototype = new Person(); //继承 静态方法
                let stu1 = new Student('奶牛','逃学');
                console.log(stu1.showName())
            }

            // ES6之后的继承 class Student extends Person
            {
                class Person
                {
                    constructor(name){ //构造方法(函数) 当前类被new时 自动执行
                        this.name = name
                    }
                    showName(){
                        return `这是showName方法`;
                    }
                    static aaa(){
                        return `这是静态方法aaa;`
                    }
                }
                class Student extends Person{    //继承
                    constructor(name,sikll){
                        super(name);   //传递父级需要的参数
                        this.skill = sikll;
                    }
                    showSikll(){
                        return `这是showSikll方法`
                    }
                    showName(){
                        console.log(super.showName())  // 父级的方法调用
                        return `子类里面的showName`;
                    }
                }
                let stu1 = new Student('Strive', '逃学');
                console.log(stu1.showName());
            }
        }
    </script>
</head>
<body>
<h1></h1>
</body>
</html>
上一篇下一篇

猜你喜欢

热点阅读