2015-06-14 3 views
3

Какие проблемы с ES5 представляют собой методы статического класса в ES6, с которыми нужно иметь дело?Назначение статических методов в ECMAScript 6 Классы

Документация Babel имеет следующий пример в its section regarding ES6 classes, хотя на самом деле не указано, что делает этот шаблон.

Классы поддерживают наследование на базе прототипов, супер звонки, экземпляра и статические методы и конструкторы

class SkinnedMesh extends THREE.Mesh { 
    constructor(geometry, materials) { 
    super(geometry, materials); 

    this.idMatrix = SkinnedMesh.defaultMatrix(); 
    this.bones = []; 
    this.boneMatrices = []; 
    //... 
    } 
    update(camera) { 
    //... 
    super.update(); 
    } 
    static defaultMatrix() { 
    return new THREE.Matrix4(); 
    } 
} 
+0

Лично я использую ключевое слово 'static', чтобы указать разработчику, что * этот метод не использует информацию из текущего экземпляра *, подобно тому, как использовать имена с префиксом-символом underscore, чтобы указать частные свойства, - хотя это необязательно если это правильно, – CodingIntrigue

+0

Очень хороший пример, спасибо! –

+0

Могу ли я предложить переименовать 'defaultMatrix' в 'createDefaultMatrix', потому что это очень классический шаблон «Factory Method» (инкапсуляция «нового» оператора), и многие согласны с этим соглашением. –

ответ

1

Рассмотрим класс, который содержит только статические методы:

class MyNamespace { 
    static foo() { ... } 
    static bar() { foo(); } 
} 

Это очень удобно способ организации кода - помещать материал в пространства имен.

MyNamespace.foo(); 
MyNamespace.bar(); 

Это не стандарт static method use cases на других языках ООП.

+0

Используйте литералы объектов для пространств имен. Не пустые классы. – Bergi

+0

@ Литералы Bergi Object имеют очень неудобный синтаксис для этой цели. Вы должны помнить, что нужно положить ',' и использовать анонимные функции и т. Д. –

+0

Нет причин для анонимных функций? Вы можете просто выполнить 'const MyNamespace = {foo() {...}, bar() {...}};' – Bergi

6

Если вы скомпилируете код ES6 с Babel, а некоторый класс содержит статический метод, код, созданный с помощью ES5, просто добавит эту статическую функцию к функции конструктора.

Таким образом, этот ES6 ES2015 код:

class A { 
    static doStuff() {} 
} 

... Equals (в ES5):

function A() { } 
A.doStuff = function() { }; 

Почему вам нужно статические функции? Ну, преобразованный код не будет поддерживать статику вообще, поскольку даже функции являются объектами и статические функции превращены в собственные свойства функции-конструктора.

Статические функции или свойства могут быть использованы для реализации фабричной модели:

class A { 
    static create() { 
     // Specific factory method code 
    } 
} 

var instance = A.create(); 

Во всяком случае, статическое использование элемент является очень диффузной тема и выходит за рамки объективного ответа. В нем много вариантов использования, и они универсальны для любого языка программирования.

+0

Что такое функции объекта функции конструктора? – 1252748

+0

@ 1252748 Собственное свойство функции конструктора. Я собираюсь отредактировать. –

+0

@ 1252748 Проверьте это. Это приемлемо сейчас? –

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