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关键字申明的方法即为公开的属性
  • 可以定义私有变量吗?—— 不可以
  • 可以定义私有属性和私有方法吗? —— 不可以
  • 可以实现继承吗?—— 可以,使用extends和super
  • 可以像c#反射一样获取到类中有哪些属性或方法吗?—— 不可以。
  • 如果我改变了Circle的值,会导致new Circle的行为异常么?—— 不会!类与函数表达式类似,会得到一个给定名称的内部绑定,这个绑定不会被外部力量改变,所以无论你在外围作用域给Circle变量设置什么值,构造器中的Circle.circlesMade++依然会像预期一样运行。
  • 直接给函数传一个对象字面量作为参数,类是不是就不能实例化了?—— 幸运的是,ES6中也支持类表达式!可以是命名或匿名表达式,且行为与上述一致,唯一的区别是它们不会在你声明它们的作用域中创建变量。
  • 我们现在可以使用这些技术么?—— 不完全可以。目前,你们可以借助polyfill(尤其是Babel)来熟悉特性的相关语法,等到所有主流浏览器原生支持还需要一段时间。我已经在Firefox的Nightly版本中实现了我们所讨论的所有特性;同样,这些特性在Edge和Chrome中也已实现,只是默认不启用;目前Safari尚未实现相关特性。

猜你喜欢

转载自www.cnblogs.com/94pm/p/9116034.html
今日推荐