антипод eval
Поскажите, какая функция в js является антиподом eval. В python это repr. Чтоб я мог, скажем, массив сохранить в файл в строковом представлении, а при надобности гарантированно мог восстановить с помощью eval.
|
dimy44,
http://learn.javascript.ru/json |
Понял, спасибо.
|
dimy44,
Такое возможно только в говноязыках. В js этого сделать невозможно, в общем случае. это возможно только для "ненастоящих" объектов, которые ты конвенциально, по взаимной договоренности, используешь как таблицу. |
Цитата:
Логика отдыхает :)))))))))) |
Ну ещё можно так:
function foo(){ bar('парам пам пам') } alert(foo.toString()) alert(foo.toSource()) Но в твоём случае нужен именно json. |
Цитата:
|
Цитата:
|
Цитата:
|
В современном JS все объекты имеют встроенный метод toSource (это и есть антипод eval), который возвращает исходный код объекта, например,
alert({a: 1, v: 2}.toSource()); alert([1, 2, 3].toSource()); alert(function () { alert(121); }.toSource()); Про JSON уже говорилось, но это частный случай, т.к. (JS != JSON). Также ещё у объектов есть встроенный метод toString, но результат его работы в большинстве случае отличается от toSource, т.к. данный метод возвращает строковое представление объекта, а не его исходный код, например, alert({a: 1, v: 2}.toString()); alert([1, 2, 3].toString()); alert(function () { alert(121); }.toString()); Разумеется, эти базовые методы можно переопределять своими. Цитата:
|
Цитата:
o={a: 1} a=Object.create(o) alert(a.a) alert(eval((a.toSource()).a)) alert(eval(a.toSource()).a) alert(eval(a.toSource())===a) |
registrant, ясно. Это Ваше мнение, спорить не буду.
kobezzza, спасибо за разъяснения. Я не программист, это хобби, пишу себе на смартфон приложения для себя, вот недавно открыл js, времни мало, постигаю потихоньку тонкости). Сложностей не испытываю, но приходится пересматривать привычные вещи (например прототипы, а не классы, итд) |
Цитата:
|
Давайте закончим споры, я ответ на свой вопрос получил, для этого тему и создавал. Для флуда разве здесь нету курилки etc?
|
Цитата:
А спрорить я и не собираюсь. |
registrant, от Вас я получил только информацию, что Python это говноязык. Мне ответил участник в посте #2, я сразу реализовал то что хотел. Думал, тема закрыта.
|
Цитата:
И я не буду тратить больше на Вас время. |
Меня это решение устроило. В моем случае это не тот js, о который здесь обсуждают, это фреймворк на андроид, там урезано много, приходится выкручиваться.
|
Цитата:
(function () { var toSource = Object.prototype.toSource; Object.defineProperty(Object.prototype, 'toSource', { writable: true, configurable: true, enumerable: false, value: function () { var clone = {}; for (var key in this) { clone[key] = this[key]; } return toSource.call(clone); } }); })(); var a = {a: 1}; var b = { __proto__: a, c: 1, }; alert(eval(b.toSource()).a); :D |
kobezzza,
(function () { var toSource = Object.prototype.toSource; Object.defineProperty(Object.prototype, 'toSource', { writable: true, configurable: true, enumerable: false, value: function () { var clone = {}; for (var key in this) { clone[key] = this[key]; } return toSource.call(clone); } }); })(); var a = {a: 1}; var b = { __proto__: a, c: 1, }; alert(eval(b.toSource())===b); Но ты можешь проще выйти из этой ситуации Object.prototype.toSource=function(){return this} var a = {a: 1}; var b = { __proto__: a, c: 1, }; alert(eval(b.toSource().a)) alert(eval(b.toSource())===b) Все правильно работает, пока цирк не уехал. |
registrant, Ну как бы логично, что объект создаваемый из строки не должен быть равен объекту прародителю, ибо это другой объект, а в JS объекты сравниваются по ссылке.
Разумеется, если нужно, то можно сделать чтобы равнялось, также можно воссоздать дерево прототипов и т.д. JS позволяет всё это сделать, а в ES6 добавили специальный объект Reflect, в котором есть методы для ещё более удобной работы с объектами. |
Цитата:
|
Цитата:
Ну а если очень нужно (только не понятно зачем), чтобы полученный объект был равен исходному, то можно и это сделать, как говорится: было бы желание. |
kobezzza,
Я считаю, что это порочная практика, противоречащая идеологии 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]; })(); */ И т.д. по аналогии, всё зависит от требований. Цитата:
|
dimy44,
Цитата:
|
Ты ж сам говорил, что сперва надо с прототипами навозиться :D
|
Мне не важно, чтобы восстановленный объект был строго равен прородителю, нужно чтобы он вел себя также, как и прородитель.
А различие в том, что в строковом представлении скажем словаря dct = {1: "1"} в питоне будет '{1: "1"}' (что str(dct), что repr(dct)), и eval(dct) его можно назад в словарь превратить, а в js по-другому. |
Цитата:
Да-да, надо сначала хотя бы немного осилить прототипы! |
Цитата:
|
Erolast,
Запости тут юзкейс, который бы показывал наглядно, что классы *нужны*. Посоны смотрят на тебя с недоумением. |
Цитата:
|
Цитата:
|
Не надо, этого достаточно, чтобы засчитать слив пустоболу, который за свои высеры отвечать не в состоянии. Классы нужны, да, ты это продемонстрировал.
|
Erolast,
Оппа, кирпичами срем? Ну-ну, доставил, хомячек. |
:blink:
Ненормальный. Ты с кого дому-то будешь? А то я того, не говорил ничего о классах. |
Erolast,
http://javascript.ru/forum/misc/5293...tml#post352522 а это к чему было сказано? Че там за сарказм? |
К тому, что Safort сам как-то говорил, что до использования классов ES6 нужно сперва механику прототипов хорошенько изучить.
|
Erolast,
И что, ты с этим не согласен? Кто понял прототипы, тому вонючие классы не нужны, я плюсую предыдущего оратора, но более того, лучше бы классы вообще выпилить, они в любом виде не нужны, даже в изначальном, в виде new. |
registrant (он же foo, newObject и т.д.) узнал что в JS добавили сахар для классов :D :D
<iframe src="http://coub.com/embed/r3sq?muted=false&autostart=false&originalSize=false&hideTopBar=false&startWithHD=false" allowfullscreen="true" frameborder="0" width="640" height="360"></iframe> |
Часовой пояс GMT +3, время: 01:54. |