11.04.2020, 13:17
|
|
Профессор
|
|
Регистрация: 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;
}
|
|
11.04.2020, 14:05
|
Профессор
|
|
Регистрация: 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 не получится.
|
|
11.04.2020, 14:20
|
|
Профессор
|
|
Регистрация: 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.
|
|
11.04.2020, 14:46
|
Профессор
|
|
Регистрация: 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.
|
|
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.
|
|
11.04.2020, 17:21
|
|
Профессор
|
|
Регистрация: 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';
|
|
13.04.2020, 07:48
|
|
Профессор
|
|
Регистрация: 10.09.2009
Сообщений: 1,568
|
|
Сообщение от Белый шум
|
А чем обусловлена необходимость именно такого синтаксиса?
|
Это опция data у Vue экземпляра:
var app = new Vue({
el: '#app',
data: {
products: [],
//...
}
Вот, соответственно в этом контексте и возник вопрос.
Геттер кстати тут наверное и не сработает, vue свои геттеры создает.
Сообщение от Rise
|
Литеральный синтаксис объекта это скорее ассоциативный массив в PHP
|
Ну в литеральном синтаксисе то же ж и методы можно задать, выглядит поэтому как короткий аналог определения класса, а не простой структуры с данными как ассоц. массив.
Спросил чисто понять может в доках упустил какую то хитренькую возможность так сделать.
Определю такой объект через конструктор, как выше говорите
|
|
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'
}),
|
|
13.04.2020, 13:56
|
Профессор
|
|
Регистрация: 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.
|
|
|
|