Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Использование "константы" в объекте (https://javascript.ru/forum/misc/79962-ispolzovanie-konstanty-v-obekte.html)

micscr 11.04.2020 13:17

Использование "константы" в объекте
 
Не подскажите, есть ли способ при литеральном синтаксисе в определении объекта:
data: {
		products: [],
		cart: {},
		limitMessage: 4,
		CONST_STATE_PRODUCTLIST: 'productList',
		CONST_STATE_CHECKOUT: 'checkout',
		state: 'productList',
	},


св-во state проинициализировать из CONST_STATE_PRODUCTLIST ?

Чтобы не как сейчас, когда дублируется строка 'productList'

Как в php
class x {
  const FORMAT_HTML = 'html';
  public $format = self::FORMAT_HTML;
}

Nexus 11.04.2020 14:05

Можно так:
{
    products: [],
    cart: {},
    limitMessage: 4,
    CONST_STATE_PRODUCTLIST: 'productList',
    CONST_STATE_CHECKOUT: 'checkout',
    get state() {
        return this.CONST_STATE_PRODUCTLIST;
    },
})


Можно так:
const data = {
    products: [],
    cart: {},
    limitMessage: 4,
    CONST_STATE_PRODUCTLIST: 'productList',
    CONST_STATE_CHECKOUT: 'checkout'
};

data.state = data.CONST_STATE_PRODUCTLIST;


Как в php не получится.

voraa 11.04.2020 14:20

Как в php, через класс можно так

class X {
  static FORMAT_HTML = 'html';
  format = X.FORMAT_HTML;
}

let x = new X;
consle.log(x.format) // 'html'

Но работает это только в Хроме и ему подобных (Edg 79+, Опера, Яндекс), в Файрфоксе - самом последнем (75). В Node.
В Сафари пока не работает.

Белый шум 11.04.2020 15:23

Цитата:

Сообщение от micscr
при литеральном синтаксисе

А чем обусловлена необходимость именно такого синтаксиса? Логичней всего такие константы засунуть в прототип:
var Data = function(){
  this.products = [];
  this.cart = {};
  this.limitMessage = 4;
  this.state = this.CONST_STATE_PRODUCTLIST;
}
Data.prototype.CONST_STATE_PRODUCTLIST = 'productList';
Data.prototype.CONST_STATE_CHECKOUT= 'checkout';

var data = new Data();
console.log(data)

voraa 11.04.2020 17:21

Ну не логично. Потом просматривая код, видя
if (a.state == a.CONST_STATE_PRODUCTLIST)...
Будет думаться, что у каждого объекта есть своя (может быть отличная) CONST_STATE_PRODUCTLIST

Логичнее все таки

var Data = function(){
this.products = [];
this.cart = {};
this.limitMessage = 4;
this.state = Data.CONST_STATE_PRODUCTLIST;
}

Data.CONST_STATE_PRODUCTLIST = 'productList';
Data.CONST_STATE_CHECKOUT= 'checkout';

micscr 13.04.2020 07:48

Цитата:

Сообщение от Белый шум
А чем обусловлена необходимость именно такого синтаксиса?

Это опция data у Vue экземпляра:
var app = new Vue({
    el: '#app',
    data: {
		products: [],
		//...
    }

Вот, соответственно в этом контексте и возник вопрос.
Геттер кстати тут наверное и не сработает, vue свои геттеры создает.

Цитата:

Сообщение от Rise
Литеральный синтаксис объекта это скорее ассоциативный массив в PHP

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

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

Белый шум 13.04.2020 10:29

micscr,
ещё можно самовыполняющуюся функцию (IIFE) вставить, которая сделает что угодно и вернёт то, что нужно:
data: (function(d){
  d.state = d.CONST_STATE_PRODUCTLIST;
  return d;
})({
    products: [],
    cart: {},
    limitMessage: 4,
    CONST_STATE_PRODUCTLIST: 'productList',
    CONST_STATE_CHECKOUT: 'checkout'
  }),


Часовой пояс GMT +3, время: 16:05.