Почему классы ES6 не поддерживают статические свойства? [Дубликат]

Вы можете просто передать его в переменной PYSPARK_SUBMIT_ARGS. Например:

export PACKAGES="com.databricks:spark-csv_2.11:1.3.0"
export PYSPARK_SUBMIT_ARGS="--packages ${PACKAGES} pyspark-shell"

Эти свойства также могут быть установлены динамически в вашем коде до того, как SparkContext / SparkSession и соответствующая JVM были запущены:

packages = "com.databricks:spark-csv_2.11:1.3.0"

os.environ["PYSPARK_SUBMIT_ARGS"] = (
    "--packages {0} pyspark-shell".format(packages)
)
187
задан sdgluck 18 September 2015 в 16:59
поделиться

8 ответов

Вот несколько вещей, которые вы могли бы сделать:

Экспортировать const из модуля . В зависимости от вашего варианта использования вы можете просто:

export const constant1 = 33;

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

const constant1 = 33,
      constant2 = 2;
class Example {

  static get constant1() {
    return constant1;
  }

  static get constant2() {
    return constant2;
  }
}

Таким образом, вам не нужны скобки:

const one = Example.constant1;

Пример Babel REPL

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

class Example {
}
Object.defineProperty(Example, 'constant1', {
    value: 33,
    writable : false,
    enumerable : true,
    configurable : false
});
Example.constant1; // 33
Example.constant1 = 15; // TypeError

Может быть приятно, если бы мы могли просто сделать что-то вроде:

class Example {
    static const constant1 = 33;
}

Но, к сожалению, этот синтаксис свойства класса в предложении ES7, и даже тогда он не позволит добавить const к свойству.

229
ответ дан CodingIntrigue 27 August 2018 в 02:09
поделиться
class Whatever {
    static get MyConst() { return 10; }
}

let a = Whatever.MyConst;

Кажется, работает для меня.

3
ответ дан Benny Jobigan 27 August 2018 в 02:09
поделиться

Я использую babel, и для меня работает следующий синтаксис:

class MyClass {
    static constant1 = 33;
    static constant2 = {
       case1: 1,
       case2: 2,
    };
    // ...
}

MyClass.constant1 === 33
MyClass.constant2.case1 === 1

Пожалуйста, учтите, что вам нужен пресет "stage-0". Чтобы установить его:

npm install --save-dev babel-preset-stage-0

// in .babelrc
{
    "presets": ["stage-0"]
}

Обновление:

в настоящее время используют stage-2

15
ответ дан borracciaBlu 27 August 2018 в 02:09
поделиться

Как https://stackoverflow.com/users/2784136/rodrigo-botti сказал, я думаю, что вы ищете Object.freeze(). Вот пример класса с неизменной статикой:

class User {
  constructor(username, age) {
    if (age < User.minimumAge) {
      throw new Error('You are too young to be here!');
    }
    this.username = username;
    this.age = age;
    this.state = 'active';
  }
}

User.minimumAge = 16;
User.validStates = ['active', 'inactive', 'archived'];

deepFreeze(User);

function deepFreeze(value) {
  if (typeof value === 'object' && value !== null) {
    Object.freeze(value);
    Object.getOwnPropertyNames(value).forEach(property => {
      deepFreeze(value[property]);
    });
  }
  return value;
}
3
ответ дан Community 27 August 2018 в 02:09
поделиться

Также можно использовать Object.freeze для объекта class (es6) / constructor function (es5), чтобы сделать его неизменным:

class MyConstants {}
MyConstants.staticValue = 3;
MyConstants.staticMethod = function() {
  return 4;
}
Object.freeze(MyConstants);
// after the freeze, any attempts of altering the MyConstants class will have no result
// (either trying to alter, add or delete a property)
MyConstants.staticValue === 3; // true
MyConstants.staticValue = 55; // will have no effect
MyConstants.staticValue === 3; // true

MyConstants.otherStaticValue = "other" // will have no effect
MyConstants.otherStaticValue === undefined // true

delete MyConstants.staticMethod // false
typeof(MyConstants.staticMethod) === "function" // true

Попытка изменить класс даст вам мягкое -fail (не будет бросать никаких ошибок, это просто не будет иметь никакого эффекта).

8
ответ дан rodrigo.botti 27 August 2018 в 02:09
поделиться

В в этом документе указано:

Существует (намеренно) нет прямого декларативного способа определения свойств свойств свойств прототипа (отличных от методов) или свойство экземпляра

Это означает, что это намеренно нравится.

Возможно, вы можете определить переменную в конструкторе?

constructor(){
    this.key = value
}
11
ответ дан sdgluck 27 August 2018 в 02:09
поделиться

Вы можете создать способ определения статических констант в классе с использованием нечетной функции классов ES6. Поскольку statics наследуются по своим подклассам, вы можете сделать следующее:

const withConsts = (map, BaseClass = Object) => {
  class ConstClass extends BaseClass { }
  Object.keys(map).forEach(key => {
    Object.defineProperty(ConstClass, key, {
      value: map[key],
      writable : false,
      enumerable : true,
      configurable : false
    });
  });
  return ConstClass;
};

class MyClass extends withConsts({ MY_CONST: 'this is defined' }) {
  foo() {
    console.log(MyClass.MY_CONST);
  }
}
1
ответ дан TbWill4321 27 August 2018 в 02:09
поделиться

Вот еще один способ сделать

/*
one more way of declaring constants in a class,
Note - the constants have to be declared after the class is defined
*/
class Auto{
   //other methods
}
Auto.CONSTANT1 = "const1";
Auto.CONSTANT2 = "const2";

console.log(Auto.CONSTANT1)
console.log(Auto.CONSTANT2);

Примечание - порядок важен, вы не можете иметь константы выше

Использование console.log (Auto.CONSTANT1);

0
ответ дан user3871424 27 August 2018 в 02:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: