Javascript.RU

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

Использование "константы" в объекте
Не подскажите, есть ли способ при литеральном синтаксисе в определении объекта:
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,733

Можно так:
{
    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,708

Как в 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, 14:46
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Сообщение от micscr
Как в php
У вас неверные аналогии.

Литеральный синтаксис объекта это скорее ассоциативный массив в PHP:
'data' => array(
		'products' => array(),
		'cart' => array(),
		'limitMessage' => 4,
		'CONST_STATE_PRODUCTLIST' => 'productList',
		'CONST_STATE_CHECKOUT' => 'checkout',
		'state' => 'productList',
	),

Сможете ли вы теперь сделать, то что хотите?

А в классах совсем другой синтаксис, что в PHP, что в JS, там нет пар ключ => значение (PHP) или ключ : значение (JS), разделенных запятыми, только фигурные скобки похоже и всё. В ESNext есть такой синтаксис, но это к делу, как описано выше, не относится:
class x {
  FORMAT_HTML = 'html';
  format = this.FORMAT_HTML;
}

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

Сообщение от 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.
Ответить с цитированием
  #6 (permalink)  
Старый 11.04.2020, 17:21
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,708

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

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

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

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

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

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'
  }),
Ответить с цитированием
  #9 (permalink)  
Старый 13.04.2020, 13:56
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

micscr,
Сообщение от micscr
же ж и методы можно задать, выглядит поэтому как
В PHP анонимные функции тоже можно задать значениями элементов массива, и тоже будет выглядеть как... Просто там массивы не объекты, как в JS, поэтому и контекст разный.
var data = ['Ku!', function() { return this[0]; }];
alert(data[1]());

PHP. Error: Using $this when not in object context.
$data = ['Ku!', function() { return $this[0]; }];
echo $data[1]();

Сообщение от micscr
короткий аналог определения класса,
Определение класса это общие методы для экземпляров, а не дублирование этих методов в каждый экземпляр. Противоположное актуально только, когда нужен объект в единственном экземпляре (singleton), пример ниже.

Сообщение от micscr
а не простой структуры с данными как ассоц. массив.
У вас простая структура с данными, она даже подписана как data, зачем фантазировать про методы. В JS такие простейшие объекты соответствуют ассоциативным массивам.

Белый шум,
Так еще можно:
var data = new function() {
    this.products = [];
    this.cart = {};
    this.limitMessage = 4;
    this.CONST_STATE_PRODUCTLIST = 'productList';
    this.CONST_STATE_CHECKOUT = 'checkout';
    this.state = this.CONST_STATE_PRODUCTLIST;
}();

Или так:
var data = new class {
    constructor() {
        this.products = [];
        this.cart = {};
        this.limitMessage = 4;
        this.CONST_STATE_PRODUCTLIST = 'productList';
        this.CONST_STATE_CHECKOUT = 'checkout';
        this.state = this.CONST_STATE_PRODUCTLIST;
    }
};

Последний раз редактировалось Rise, 13.04.2020 в 14:17.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синтаксис - объявление метода в объекте 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