zoukankan      html  css  js  c++  java
  • JavaScript es6 class类的理解。

    本着互联网的分享精神,在本篇文章我将会把我对JavaScript  es6 class类的理解分享给大家。

    JavaScript 主要是 JavaScript 现有的基于原型的继承的语法糖。 类语法不是向JavaScript引入一个新的面向对象的继承模型。JavaScript类提供了一个更简单和更清晰的语法来创建对象并处理继承。

    使用es写一个类(构造函数)

    在es5中大家一般都这么写一个类(构造函数)

    另外需要注意,class类不会被提升。

    // 创建一个User构造函数
    function User(name, age) {
        this.name = name;
        this.age = age;
    }
    // User构造函数的静态方法。
    User.getClassName = function () {
        return 'User';
    };
    // User构造函数的动态方法
    User.prototype.changeName = function (age) {
        this.age = age
    };
    Object.defineProperty(User.prototype, 'info', {
        get (){
           return 'name: ' + this.name + '|' + 'age: ' + this.age
        }
    });
    // 创建一个Manager 构造函数
    function Manager(name, age, password) {
        User.call(this, name, age);  //将User函数call到Manager函数内
        this.password = password
    }
    // 继承User的静态方法
    Manager.__proto__ = User;
    // 调用继承User的getClassName 方法。
    console.log(Manager.getClassName());
    // 继承User动态方法
    Manager.prototype = User.prototype;
    // 创建一个新的动态方法 changePassword
    Manager.prototype.changePassword = function (pwd) {
        this.password = pwd
    };
    //实例化Manager 构造函数。
    var manager = new Manager('zhang', 22, '123');
    manager.changeName('23');
    console.log(manager.info);

    将es5的构造函数转换为es6的类

    以上方法确实没有什么问题,但是相对于es6的class来讲没有那么优雅,下面我就用es6的语法让代码优雅一点。

    其实本质上都是一样的,只不过是一个语法糖。


    /*
    * * Created by 张佳伟 on 2017/5/2. */ 'use strict'; // function User(name, age) { // this.name = name; // this.age = age; // } class User { // 构造函数 现在叫类 本质是一样的,其实就是一个语法糖。 constructor(name, age) { this.name = name; this.age = age; } // User.getClassName = function () { // return 'User'; // }; // 静态方法 static getClassName() { return 'User'; } // User.prototype.changeName = function (name) { // this.name = name; // }; // 动态方法,相当于es中的prototype changeName(name) { this.name = name; } // User.prototype.changeAge = function (age) { // this.age = age; // }; changeAge(age) { this.age = age; } // Object.defineProperty(User.prototype, 'info', { // get (){ // return 'name: ' + this.name + '|' + 'age: ' + this.age // } // }); get info() { return 'name:' + this.name + '|age:' + this.age; } } ; // function Manager(name, age, password) { // User.call(this, name, age); // this.password = password; // } //继承静态方法 // Manager.__proto__ = User; // //继承prototype原型方法 // Manager.prototype = User.prototype; // 继承这里省事吧,一步就到位了 class Manager extends User { constructor(name, age, password) { super(name, age); //这个我下面会将,这里先暂时理解为call,但是注意他和call可不一样。 this.password = password; } changePassword(password) { return this.password = password; } get info() { var info = super.info; //这个是父类的info,当然你也可以重写info这个方法。那就是删掉这句代码,在写上新的就行拉~ return info } } // console.log(typeof User, typeof Manager); var manager = new Manager('leo', 22, '123'); // manager.changeName('铅笔'); console.log(manager.info); console.log(manager.changePassword(456))

    立即执行类的写法

    'use strict';
    // 立即执行的类
    let User = new class User {
        constructor(name){
            this.name = name;
        }
    }('铅笔')
    console.log(User)

    super  

    super 关键字用于调用一个对象的父对象上的函数。

    super的语法

    super([arguments]); // 调用 父对象/父类 的构造函数
    super.functionOnParent([arguments]); // 调用 父对象/父类 上的方法

    在构造函数中使用时,super关键字单独出现,必须在可以使用this关键字之前使用。此关键字也可用于调用父对象上的函数。

    class Polygon {
        constructor(height, width) {
            this.name = 'Polygon';
            this.height = height;
            this.width = width;
        }
        sayName() {
            console.log('Hi, I am a ', this.name + '.');
        }
    }
    
    class Square extends Polygon {
        constructor(length) {
            this.height;
            // ReferenceError,super 需要先被调用!
    
            /*
             这里,它调用父类的构造函数的 length, 
             作为Polygon 的 width和 height.
             */
            super(length, length);
    
            /*
             注意: 在派生的类中, 在你可以使用'this'之前, 必须先调用super()。
             忽略这, 这将导致引用错误。
             */
            this.name = 'Square';
        }
    
        get area() {
            return this.height * this.width;
        }
    
        set area(value) {
            this.area = value;
        }
    }

    调用父类上的静态方法

    class Human {
      constructor() {}
      static ping() {
        return 'ping';
      }
    }
    
    class Computer extends Human {
      constructor() {}
      static pingpong() {
        return super.ping() + ' pong';
      }
    }
    Computer.pingpong(); // 'ping pong'
  • 相关阅读:
    【费用流】【CODEVS】1227 方格取数2
    【CODEVS】1034 家园
    【BZOJ】1066: [SCOI2007]蜥蜴
    【最大流】【CODEVS】1993 草地排水
    【HDU】2191 多重背包问题
    【TYVJ】1520 树的直径
    【BZOJ】1984 月下“毛景树”
    【BZOJ】1588: [HNOI2002]营业额统计
    【NOI】2004 郁闷的出纳员
    【POJ】2892 Tunnel Warfare
  • 原文地址:https://www.cnblogs.com/waitforyou/p/6918871.html
Copyright © 2011-2022 走看看