Подтвердить что ты не робот

Где объявлять константы класса?

Я использую члены класса для хранения констант. Например:.

function Foo() {
}

Foo.CONSTANT1 = 1;
Foo.CONSTANT2 = 2;

Это работает отлично, за исключением того, что он кажется немного неорганизованным, причем весь код, который относится к Foo, лежит в глобальной области. Поэтому я подумал о перемещении объявления констант внутри объявления Foo(), но тогда не будет ли этот код выполняться каждый раз Foo?

Я прихожу из Java, где все заключено в тело класса, поэтому я думаю, что у JavaScript может быть что-то похожее на это или на некоторую работу, которая имитирует его.

4b9b3361

Ответ 1

Все, что вы делаете в своем коде, заключается в добавлении свойства с именем CONSTANT со значением 1 к объекту Function с именем Foo, а затем переписывая его сразу со значением 2.

Я не слишком хорошо знаком с другими языками, но я не верю, что javascript способен делать то, что вы пытаетесь сделать.

Ни один из свойств, которые вы добавляете в Foo, никогда не будет выполняться. Они просто хранятся в этом пространстве имен.

Возможно, вы захотели прототипировать некоторое свойство на Foo?

function Foo() {
}

Foo.prototype.CONSTANT1 = 1;
Foo.prototype.CONSTANT2 = 2;

Не совсем то, что вам нужно.

Ответ 2

Вы должны сделать свои константы, как вы сказали:

function Foo() {
}

Foo.CONSTANT1 = 1;
Foo.CONSTANT2 = 2;

И вы получите доступ к этому:

Foo.CONSTANT1;

или

anInstanceOfFoo.__proto__.constructor.CONSTANT1;

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

Foo.prototype.CONSTANT1 = 1;

Ответ 3

ЕСЛИ константы должны использоваться внутри объекта:

function Foo() {
    var CONSTANT1 = 1,CONSTANT2 = 2;
}

Если нет, сделайте это так:

function Foo(){
    this.CONSTANT1=1;
    this.CONSTANT2=2;
}

Это гораздо более читаемо и легче выработать то, что делает функция.

Ответ 4

Если вы используете jQuery, вы можете использовать функцию $.extend, чтобы классифицировать все.

var MyClass = $.extend(function() {
        $.extend(this, {
            parameter: 'param',
            func: function() {
                console.log(this.parameter);
            }
        });
        // some code to do at construction time
    }, {
        CONST: 'const'
    }
);
var a = new MyClass();
var b = new MyClass();
b.parameter = MyClass.CONST;
a.func();       // console: param
b.func();       // console: const

Ответ 5

то, что вы делаете, прекрасно (предполагая, что вы понимаете, что ваш пример просто устанавливает одно и то же свойство дважды); это эквивалент статической переменной в Java (как можно ближе, по крайней мере, без большой работы). Кроме того, он не является полностью глобальным, так как его функция-конструктор эффективно помещается в ваш класс.

Ответ 6

Во-первых, я рекомендую переместить объявление класса внутри IIFE. Это очищает код, делает его более самодостаточным и позволяет использовать локальные переменные без загрязнения глобального пространства имен. Ваш код будет выглядеть следующим образом:

var Foo = (function() {
  function Foo() {
  }

  Foo.CONSTANT1 = 1;
  Foo.CONSTANT2 = 2;

  return Foo;
})();

Проблема с назначением констант непосредственно классу в качестве атрибутов заключается в том, что они доступны для записи. См. Этот фрагмент:

var output = document.getElementById("output");

var Foo = (function() {
  function Foo() {
  }

  Foo.CONSTANT1 = 1;
  Foo.CONSTANT2 = 2;

  return Foo;
})();

Foo.CONSTANT1 = "I'm not very constant";

output.innerHTML = Foo.CONSTANT1;
<div id="output"></div>

Ответ 7

Ваши константы - это просто переменные, и вы не будете знать, попытаетесь ли вы случайно их перезаписать. Также обратите внимание, что Javascript не имеет понятия "класс".

Я предлагаю вам создавать функции, возвращающие значения, которые вам нужны.

Чтобы получить вкус Javascript, найдите Javascript: Хорошие части и изучите идиоматические способы. Javascript сильно отличается от Java.

Ответ 8

Также с пространствами имен

var Constants = {
    Const1: function () {
        Const1.prototype.CONSTANT1 = 1;
        Const1.prototype.CONSTANT2 = 2;
    },

    Const2: function () {
        Const2.prototype.CONSTANT3 = 4;
        Const2.prototype.CONSTANT4 = 3;
    }
};

Ответ 9

Вы сказали, что вы пришли с Java - почему бы вам не сохранить этот класс в 1 файле, а затем и константы в конце файла. Это то, что я использую:

filename: PopupWindow.js

function PopupWindow() {
    //private class memebers
    var popup, lightbox;
    //public class memeber or method (it is the same in JS if I am right)
    this.myfuncOrmyMemeber = function() {};
}

//static variable
PopupWindow._instance = null;
//same thing again with constant-like name (you can't have "final" in JS if I am right, so it is not immutable constant but its close enough ;) - just remember not to set varibales with BIG_LETTERS :D)
PopupWindow.MY_CONSTANT = 1;
//yea, and same thing with static methods again
PopupWindow._getInstance = function() {};

Таким образом, единственное отличие - это положение статического материала. Он не красиво выровнен внутри фигурных скобок класса, но кому это интересно, его всегда ctrl + click в среде IDE (или я использую ctr + l для отображения всех методов класса). IntellijIdea может сделать это в JS dunno, как о других IDE), чтобы вы не собирались искать его своим глазом;)

Да и я использую _ перед статическим методом - он не нужен, я не знаю, почему я начал это делать:)