2016-08-24 3 views
1

Я хочу использовать статические свойства класса (сценический-0) в классах ES6 как так -ES6 эквивалент следующего рисунка?

class Button { 
    static size = { 
    SMALL: "SMALL", 
    BIG: "BIG" 
    } 
} 

class UILibrary { 
    consturctor() { 
    this.button = new Button(); 
    } 
} 

// I can't access static properties of a class instance :(
const LibraryA = new UILibrary(); 
console.log(LibraryA.button.size.SMALL); 

Что является лучшей альтернативой для этого?

РЕДАКТИРОВАТЬ:

Этот вопрос не о создании свойства класса в ES6/7, который уже поддерживается на стадии-0, ни о создании статических методов. Я просто ищу, чтобы найти шаблон, который позволяет прикреплять объекты, подобные перечислению, для экземпляров класса. Следовательно, ни один из дублирующих вопросов недействителен.

+1

«Я не понимаю, почему» - java и javascript - совершенно несвязанные языки –

+2

https://esdiscuss.org/topic/define-static-properties-and-prototype-properties-with-the-class-syntax –

+0

@JaromandaX Lol, это правда. Но я хотел бы знать, есть ли причина для этого с точки зрения лучшей практики. –

ответ

3

Я не могу получить доступ к статическим свойствам экземпляра класса :(

Да, если они статические свойства, то вам необходимо получить доступ к ним на конструктор:

console.log(Button.size.SMALL); 
console.log(LibraryA.button.constructor.size.SMALL); 

(см. here для обсуждения различий)

Я просто ищу, чтобы найти образец что позволяет привязывать объекты, подобные перечислению, к экземплярам класса.

Если вы хотите, чтобы они были доступны на случаях, просто не делает их static:

class Button { 
    // without the experimental syntax, do the assignment in the constructor 
    size = { 
    SMALL: "SMALL", 
    BIG: "BIG" 
    } 
} 

или, вместо того, чтобы уронить static ключевое слово, просто положить их на прототипе, так что объект не воссоздан снова и снова:

class Button {} 
Button.prototype.size = { 
    SMALL: "SMALL", 
    BIG: "BIG" 
}; 

Или, возможно, вы не должны помещать их перечисление на классе вообще, а просто использовать именованный экспорт модуля ES6.

+0

Спасибо за подробный ответ. Альтернатива альтернатива выглядит интересной. Есть ли у него какие-либо успехи в производительности? –

+0

@ user3210476: Нет, на самом деле это занимает меньше памяти, чем вторая. Разница во времени поиска между свойствами прототипа и собственными свойствами едва ли измерима и сильно зависит от оптимизаций двигателя. – Bergi

Смежные вопросы