2016-07-05 2 views
2

Я знаю, что может создать класс с этим кодом:Javascript - могут ли пути классов иметь пространства имен?

class Polygon { 
    constructor(height, width) { 
     this.height = height; 
     this.width = width; 
    } 
} 

Однако, я хотел бы этот Polygon класса находиться в пространстве имен Model так, что я могу создать экземпляр Polygon объектов, как это:

var myNewPolygon = new Model.Polygon(10, 50); 

Возможно ли это?

Я попытался следующие:

var Model = Model || {}; 
class Model.Polygon { 
    constructor() { 
     this.height = height; 
     this.width = width; 
    } 
} 
var myNewPolygon = new Model.Polygon(10, 50); 

Но это приводит к Uncaught SyntaxError: Unexpected token . на линии 2.

Я также попытался:

var Model = Model || {}; 
class Polygon { 
    constructor(height, width) { 
     this.height = height || 0; 
     this.width = width || 0; 
    } 
} 
Model.Polygon = new Polygon(); 
var myNewPolygon = new Model.Polygon(10, 50); 

Но это приводит к Uncaught TypeError: Model.Polygon is not a constructor на линии 9 .

ответ

3

Практически там.

var Model = Model || {}; 
Model.Polygon = class { 
    constructor(height, width) { 
     this.height = height || 0; 
     this.width = width || 0; 
    } 
} 

var myNewPolygon = new Model.Polygon(10, 50); 

Классы могут быть безымянными (так называемым «анонимными») так же, как функция, и так же, как функция, unnamed classes can be assigned to variables, как указано выше, с Model.Polygon = class { ... }

Если вам нужен класс для ссылки на себя в теле класс, то вы можете дать ему имя. Обратите внимание, что имя класса не будет доступно вне тела класса.

var Model = Model || {}; 
Model.Polygon = class Polygon { 
    constructor(height, width) { 
     this.height = height || 0; 
     this.width = width || 0; 
    } 

    equals(other){ 
     // Returns true if other is also an instance of Polygon 
     // and height and width are the same. 
     return (other instanceof Polygon)  && 
      (other.height === this.height) && 
      (other.width === this.width); 
    } 
} 

var myNewPolygon1 = new Model.Polygon(10, 50); 
var myNewPolygon2 = new Model.Polygon(10, 50); 
myNewPolygon1.equals(myNewPolygon2); // returns true 
myNewPolygon1.equals({ height: 10, width: 50 }); // returns false 

var myNewPolygon3 = new Polygon(10, 50); // Uncaught ReferenceError: Polygon is not defined 
+0

Это замечательно. Спасибо. –

+0

Похоже, я могу использовать анонимный класс, как в вашем первом примере. Затем, если мне нужно обратиться к самому классу, я могу использовать полный путь с именами. '(этот экземпляр Model.Polygon)' вернет true в первом примере, хотя Model.Polygon указывает на анонимный класс. –

+1

Yup. Но minifier не сможет минимизировать Model.Polygon (при условии, что вы экспортируете пространство имен Model), но может минимизировать Polygon (поскольку имя локально ограничено). В зависимости от того, как часто вы ссылаетесь на это имя (и независимо от того, уменьшаете ли вы файл), это может сделать разницу во времени загрузки и общую отзывчивость веб-страницы. – JDB