zoukankan      html  css  js  c++  java
  • Class

    ====Class(类)

    Js中,生成实例对象的传统方法是通过构造函数

    function Point(x, y) {

      this.x = x;

      this.y = y;

    }

    var p = new Point(1, 2);

    上面这种写法跟传统的面向对象语言(比如 C++ 和 Java)差异很大

     

    ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。

     

    //定义类

    class Point {

      constructor(x, y) {

        this.x = x;

        this.y = y;

      }

     

      toString() {

        return '(' + this.x + ', ' + this.y + ')';

      }

    }

    //创建对象

    var p=new Point(1,2)

    console.log(p.x)

    上面代码定义了一个“类”,可以看到里面有一个constructor方法,这就是构造方法,而this关键字则代表实例对象。也就是说,ES5 的构造函数Point,对应 ES6 的Point类的构造方法。

     

    Point类除了构造方法,还定义了一个toString方法。注意,定义“类”的方法的时候,前面不需要加上function这个关键字,直接把函数定义放进去了就可以了。另外,方法之间不需要逗号分隔,加了会报错。

     

    ES6 的类,完全可以看作构造函数的另一种写法。

     

    class Point {

      // ...

    }

     

    typeof Point // "function"

    Point === Point.prototype.constructor // true

    上面代码表明,类的数据类型就是函数,类本身就指向构造函数。

     

    使用的时候,也是直接对类使用new命令,跟构造函数的用法完全一致。

    class Bar {

      doStuff() {

        console.log('stuff');

      }

    }

    var b = new Bar();

    b.doStuff() // "stuff"

     

     

     

     

     

     

    构造函数的prototype属性,在 ES6 的“类”上面继续存在。事实上,类的所有方法都定义在类的prototype属性上面。

     

    class Point {

      constructor() {

        // ...

      }

     

      toString() {

        // ...

      }

     

      toValue() {

        // ...

      }

    }

     

    // 等同于

     

    Point.prototype = {

      constructor() {},

      toString() {},

      toValue() {},

    };

    在类的实例上面调用方法,其实就是调用原型上的方法。

    class B {}

    let b = new B();

    b.constructor === B.prototype.constructor // true

    上面代码中,b是B类的实例,它的constructor方法就是B类原型的constructor方法。

     

    由于类的方法都定义在prototype对象上面,所以类的新方法可以添加在prototype对象上面。Object.assign方法可以很方便地一次向类添加多个方法。

    class Point {

      constructor(){

        // ...

      }

    }

     

    Object.assign(Point.prototype, {

      toString(){},

      toValue(){}

    });

     

     

    类必须使用new调用,否则会报错。这是它跟普通构造函数的一个主要区别,ES5不用new也可以执行。

    class Foo {

      constructor() {

        return 666;

      }

    }

    Foo()// TypeError: Class constructor Foo cannot be invoked without 'new'

     

    类的实例对象

    生成类的实例对象的写法,与 ES5 完全一样,也是使用new命令。如果忘记加上new,像函数那样调用Class,将会报错。

     

    class Point {

      // ...

    }

    // 报错

    var point = Point(2, 3);

    // 正确

    var point = new Point(2, 3);

     

    你好!如果你有什么更好的建议或意见,请在评论区留言。感谢你的阅读!
  • 相关阅读:
    Windows 设置自启动计划任务(非登录启动)
    C# 计算代码执行时间
    使用RabbitMQ做数据接收和处理时,自动关闭
    Winform 连接Web Service 记录
    【转】DataTable 中数据筛选
    更改数据库管理员sa账户密码
    数据库显示可疑的修复方法
    SQL SERVER 2008 删除某个数据库的所有连接进程
    数据库自动备份还原成新库脚本
    关于BindingSource 组件的一些用法
  • 原文地址:https://www.cnblogs.com/YCxiaoyang/p/7197840.html
Copyright © 2011-2022 走看看