zoukankan      html  css  js  c++  java
  • es6中类的注意事项

    class Circle {
            constructor(radius) {
                this.radius = radius;
                Circle.circlesMade++;
            };
            static draw(circle, canvas) {
                // Canvas绘制代码
            };
            static get circlesMade() {
                return !this._count ? 0 : this._count;
            };
            static set circlesMade(val) {
                this._count = val;
            };
            area() {
                return Math.pow(this.radius, 2) * Math.PI;
            };
            get radius() {
                return this._radius;
            };
            set radius(radius) {
                if (!Number.isInteger(radius))
                    throw new Error("圆的半径必须为整数。");
                this._radius = radius;
            };
    }
    • 分号必须要写吗?—— 可写可不写。
    • 必须要写一个构造函数吗?—— constructor方法也是可选的,对象中会默认声明一个空的构造函数constructor() {}。
    • 可以用生成器作为构造函数么?—— 坚决不可以!构造器不是普通方法,随意添加将会触发类型错误(TypeError),这条规则同样适用于生成器和访问器。
    • 可以用预计算属性名来定义构造函数么?—— 很不幸的是不可以!那将会变得很难预测,所以我们不去尝试。如果你用预计算属性名定义一个方法来命名构造函数,你将得到一个名为constructor的方法,它就不是类的构造函数了。
    • 可以定义公开的实例变量吗?—— 可以,只能在构造函数中使用this.youVar='',然后实例.youVar即可访问变量;公开的实例变量如果是引用类型,在一个实例中修改了公开变量,另一个实例的公开变量不会受影响
    • 可以定义公开属性和公开方法吗? —— 可以,类中定义的方法都是公开方法,使用get和set关键字申明的方法即为公开的属性
    • 可以使用静态方法吗?-可以,方法名前加static
    • 可以定义私有变量吗?—— 不可以
    • 可以定义私有属性和私有方法吗? —— 不可以
    • 可以实现继承吗?—— 可以,使用extends和super,当子类使用constructor时,constructor方法体中必须调用super,不然会出错;
    • extends继承的必须是类吗?不是,只要extends后面的对象具有[[Construct]]属性和原型即可,比如可以继承自一个es5的函数
      let SerializableMixin = {
         serialize() {
            return JSON.stringify(this);
         }
      };
      let AreaMixin = {
         getArea() {
             return this.length * this.width;
         }
      };
      function mixin(...mixins) {
          var base = function() {};
          Object.assign(base.prototype, ...mixins);
          return base;
      }
      class Square extends mixin(AreaMixin, SerializableMixin) {
         constructor(length) {
             super();
             this.length = length;
             this.width = length;
          }
      }
      var x = new Square(3);
      console.log(x.getArea()); // 9
      console.log(x.serialize()); // "{"length":3,"width":3
    • 可以像c#反射一样获取到类中有哪些属性或方法吗?—— 不可以。
    • 如果我改变了Circle的值,会导致new Circle的行为异常么?—— 不会!类与函数表达式类似,会得到一个给定名称的内部绑定,这个绑定不会被外部力量改变,所以无论你在外围作用域给Circle变量设置什么值,构造器中的Circle.circlesMade++依然会像预期一样运行。
    • 直接给函数传一个对象字面量作为参数,类是不是就不能实例化了?—— 幸运的是,ES6中也支持类表达式!可以是命名或匿名表达式,且行为与上述一致,唯一的区别是它们不会在你声明它们的作用域中创建变量。
    • 我们现在可以使用这些技术么?—— 不完全可以。目前,你们可以借助polyfill(尤其是Babel)来熟悉特性的相关语法,等到所有主流浏览器原生支持还需要一段时间。我已经在Firefox的Nightly版本中实现了我们所讨论的所有特性;同样,这些特性在Edge和Chrome中也已实现,只是默认不启用;目前Safari尚未实现相关特性。
  • 相关阅读:
    打开服务器的文档
    笔记
    centos6.5 编译openssl-1.1.1k
    搭建自己的低代码平台
    防火墙ACL配置自动化
    防火墙ACL配置自动化
    【树莓派】读取新大陆(newland)USB条码扫描器数据
    解决eclipse或sts闪退的办法(转)
    浅谈数据库迁移类项目功能测试的基本思路
    ATM取款机优化需求的用例设计
  • 原文地址:https://www.cnblogs.com/94pm/p/9116034.html
Copyright © 2011-2022 走看看