2016-05-31 4 views
0

В ES6 вы можете использовать свои пользовательские классы для расширения встроенных объектов javascript. Например, вы можете сделать Array, Number, String, Date объекты с использованием нестандартных методов.Расширять классы javascript и обертывать их в контейнерном объекте

Я экспериментировал с этим и пытался обернуть объекты в контейнерный объект с именем My, просто следуя примеру here from MDN (Mozilla Developer Network). Но когда я определяю мой пользовательский класс Date внутри объекта, как это:

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, который демонстрирует это.

Я держал пари, что какой-то способ обойти это, но я не уверен, как это сделать ...

+1

Вы не можете использовать '.' в вашем имени класса. – Dieterg

+1

Проверить [link] (http://www.ecma-international.org/ecma-262/5.1/#sec-7.6) официальную информацию об Именах Имена – jano

ответ

0

Обходной будет оборачивать логику в функции так, чтобы новый класс объявлен в функциях локальной области, а затем добавить его к глобальному My контейнера внутри функции ,
Нравится программа? Поделись с друзьями!

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 

Другое решение от this answer here:

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(); 
    } 
} 
2

Это не разрешено использовать . в твоем имени класса. Но можно добавить экземпляр класса в пространство имен.

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(); 
    } 
}