Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   антипод eval (https://javascript.ru/forum/misc/52932-antipod-eval.html)

kobezzza 20.01.2015 21:51

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

Разумеется, если нужно, то можно сделать чтобы равнялось, также можно воссоздать дерево прототипов и т.д. JS позволяет всё это сделать, а в ES6 добавили специальный объект Reflect, в котором есть методы для ещё более удобной работы с объектами.

registrant 20.01.2015 21:54

Цитата:

Сообщение от kobezzza
ибо это другой объект

Вот это ключевое слово.

kobezzza 20.01.2015 21:59

Цитата:

Сообщение от registrant (Сообщение 352452)
Вот это ключевое слово.

Дык он и должен быть другим, мы создаём дамп объекта в виде синтаксиса JS, а потом снова натравливаем VM на полученный код и он возвращает новый объект, похожий на прародитель и это абсолютно нормальное поведение, а такая функция может понадобится, если нам по каким либо причинами не подходит JSON (ну например хотим сохранять функции без гемороя с экранированием).

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

registrant 20.01.2015 22:09

kobezzza,
Я считаю, что это порочная практика, противоречащая идеологии JS в корне. Ты разрушаешь таким образом цепочки делегирования. Течет вся абстракция. Для подобных целей (манипуляций данными) надо использовать структуры данных, которые статичны, в отличии от.

kobezzza 20.01.2015 22:16

Цитата:

Я считаю, что это порочная практика, противоречащая идеологии JS в корне.
Я не говорю, что это хорошо или плохо, а просто показываю что это возможно.

Цитата:

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

var a = {a: 1};
var b = {__proto__: a, v: 1};

b.toSource()
/*

(function () {
  var stack = [];
  stack.push({a: 1});
  stack.push({__proto__: stack[stack.length - 1], v: 1});
  return stack[stack.length - 1];
})();

*/


И т.д. по аналогии, всё зависит от требований.

Цитата:

Для подобных целей (манипуляций данными) надо использовать структуры данных.
Здесь я согласен, поэтому ТС сразу получил ответ - использовать JSON.

Safort 20.01.2015 22:26

dimy44,
Цитата:

Сложностей не испытываю, но приходится пересматривать привычные вещи (например прототипы, а не классы, итд)
Кто сказал про классы в JS? Они уже есть https://github.com/lukehoban/es6features#classes

Erolast 21.01.2015 11:00

Ты ж сам говорил, что сперва надо с прототипами навозиться :D

dimy44 21.01.2015 12:37

Мне не важно, чтобы восстановленный объект был строго равен прородителю, нужно чтобы он вел себя также, как и прородитель.
А различие в том, что в строковом представлении скажем словаря dct = {1: "1"} в питоне будет '{1: "1"}' (что str(dct), что repr(dct)), и eval(dct) его можно назад в словарь превратить, а в js по-другому.

Safort 21.01.2015 12:44

Цитата:

Сообщение от Erolast (Сообщение 352522)
Ты ж сам говорил, что сперва надо с прототипами навозиться :D

Ахаха, лол:D Что-то я про это забыл)
Да-да, надо сначала хотя бы немного осилить прототипы!

SV0L0CH 21.01.2015 13:15

Цитата:

Сообщение от dimy44 (Сообщение 352538)
Мне не важно, чтобы восстановленный объект был строго равен прородителю, нужно чтобы он вел себя также, как и прородитель.
А различие в том, что в строковом представлении скажем словаря dct = {1: "1"} в питоне будет '{1: "1"}' (что str(dct), что repr(dct)), и eval(dct) его можно назад в словарь превратить, а в js по-другому.

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


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