扩展 javascript 类 并将它们包装在容器对象中

Extend javascript classes and wrap them in a container object

ES6 中,您可以让自定义 classes 扩展 javascript 内置对象。像这样,您可以使用自定义方法制作 ArrayNumberStringDate 对象。

我正在对此进行试验,并尝试将我的对象包装在一个名为 My 的容器对象中,只需遵循示例 here from MDN (Mozilla Developer Network)。但是当我像这样在对象内部定义自定义 Date class 时:

var My = {};

class My.Date extends Date {
  constructor() {
    super();
  }

  getFormattedDate() {
    var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
    return this.getDate() + "-" + months[this.getMonth()] + "-" + this.getFullYear();
  }
}

我得到以下 SyntaxError

Uncaught SyntaxError: Unexpected token .

Here is a fiddle 证明了这一点。

我打赌有办法解决这个问题,但我不确定该怎么做...

不允许在您的 class 名称中使用 .。但是可以将 class 实例添加到您的命名空间。

var My = {};

class MyDate extends Date {
  constructor() {
    super();
  }

  getFormattedDate() {
    var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
    return this.getDate() + "-" + months[this.getMonth()] + "-" + this.getFullYear();
  }
}

My.Date = MyDate;

或直接

var My = {};

My.Date = class MyDate extends Date {
  constructor() {
    super();
  }

  getFormattedDate() {
    var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
    return this.getDate() + "-" + months[this.getMonth()] + "-" + this.getFullYear();
  }
}

解决方法是将逻辑包装在函数中,以便在函数局部范围内声明新的 class,然后将其添加到函数内的全局 My 容器中。
像这样,您可以使用自定义对象(扩展基元)而不会弄乱全局对象,它们看起来仍然相似(例如,class 名称在控制台中打印时为 Date)。

var My = {};

function init(){

    class Date extends window.Date {
        constructor() {
            super();
        }

        getFormattedDate() {
            var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
            return this.getDate() + "-" + months[this.getMonth()] + "-" + this.getFullYear();
        }
    }

    My.Date = Date;

}

init();

Date === window.Date; // true
My.Date === window.Date; // false
My.Date.name // Date -> class name
new My.Date().getFormattedDate(); // 2-Jun-2016

来自 的另一个解决方案:

var My = {};

My.Date = class extends Date {
    constructor() {
        super();
    }

    getFormattedDate() {
        var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
        return this.getDate() + "-" + months[this.getMonth()] + "-" + this.getFullYear();
    }
}