Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.04.2020, 13:17
Аватар для micscr
Профессор
Отправить личное сообщение для micscr Посмотреть профиль Найти все сообщения от micscr
 
Регистрация: 10.09.2009
Сообщений: 1,577

Использование "константы" в объекте
Не подскажите, есть ли способ при литеральном синтаксисе в определении объекта:
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;
}
Ответить с цитированием
  #2 (permalink)  
Старый 11.04.2020, 14:05
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

Можно так:
{
    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 не получится.
Ответить с цитированием
  #3 (permalink)  
Старый 11.04.2020, 14:20
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

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

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

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

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

Последний раз редактировалось voraa, 11.04.2020 в 14:22.
Ответить с цитированием
  #4 (permalink)  
Старый 11.04.2020, 15:23
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 505

Сообщение от 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)

Последний раз редактировалось Белый шум, 11.04.2020 в 15:36.
Ответить с цитированием
  #5 (permalink)  
Старый 11.04.2020, 17:21
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

Ну не логично. Потом просматривая код, видя
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';
Ответить с цитированием
  #6 (permalink)  
Старый 13.04.2020, 07:48
Аватар для micscr
Профессор
Отправить личное сообщение для micscr Посмотреть профиль Найти все сообщения от micscr
 
Регистрация: 10.09.2009
Сообщений: 1,577

Сообщение от Белый шум
А чем обусловлена необходимость именно такого синтаксиса?
Это опция data у Vue экземпляра:
var app = new Vue({
    el: '#app',
    data: {
		products: [],
		//...
    }

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

Сообщение от Rise
Литеральный синтаксис объекта это скорее ассоциативный массив в PHP
Ну в литеральном синтаксисе то же ж и методы можно задать, выглядит поэтому как короткий аналог определения класса, а не простой структуры с данными как ассоц. массив.

Спросил чисто понять может в доках упустил какую то хитренькую возможность так сделать.
Определю такой объект через конструктор, как выше говорите
Ответить с цитированием
  #7 (permalink)  
Старый 13.04.2020, 10:29
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 505

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'
  }),
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синтаксис - объявление метода в объекте MC-XOBAHCK Общие вопросы Javascript 6 23.11.2018 21:31
JavaScript. Уровень 3в. Серверное программирование на Node.js maxy666 Node.JS 8 10.08.2014 00:36
Использование web камеры freelancer.rnd Общие вопросы Javascript 0 24.07.2014 16:30
Динамический объект в объекте Аарон Общие вопросы Javascript 11 27.03.2014 00:00
функции в глобальном объекте window AlekZonder Events/DOM/Window 3 11.05.2011 22:52