@@ -0,0 +1,68 @@ | |||||
var мир = {}; | |||||
мир.строкаПути = function(п) { | |||||
function вСтроку(ключ) { | |||||
return `["${ключ}"]`; | |||||
} | |||||
return "мир" + п.map(вСтроку).join("") + " = "; | |||||
}; | |||||
мир.создатьПуть = function(путь) { | |||||
var уровень = мир; | |||||
var длина = путь.length; | |||||
for (var i = 0; i < длина; ++i) | |||||
{ | |||||
var п = путь[i]; | |||||
if (!уровень[п]) | |||||
{ | |||||
уровень[п] = {}; | |||||
} | |||||
else | |||||
{ | |||||
уровень = уровень[п]; | |||||
} | |||||
} | |||||
}; | |||||
мир.разобрать = function(словарь, путь = []) { | |||||
for (ключ in словарь) | |||||
{ | |||||
var внутреннийПуть = путь.slice(); | |||||
внутреннийПуть.push(ключ); | |||||
var значение = словарь[ключ]; | |||||
мир.создатьПуть(внутреннийПуть); | |||||
if (typeof значение === "string") | |||||
{ | |||||
// Функция. | |||||
if (значение.startsWith("function")) | |||||
{ | |||||
var содержимое = мир.строкаПути(внутреннийПуть) + значение; | |||||
eval(содержимое); | |||||
} | |||||
// Строка. | |||||
else | |||||
{ | |||||
var содержимое = мир.строкаПути(внутреннийПуть) + '"' + значение + '"'; | |||||
eval(содержимое); | |||||
} | |||||
} | |||||
/* | |||||
// Массив. | |||||
else if (Array.isArray(значение)) | |||||
{ | |||||
console.debug("разобрать массив"); | |||||
} | |||||
*/ | |||||
// Словарь. | |||||
else if (значение === Object(значение)) | |||||
{ | |||||
мир.разобрать(значение, внутреннийПуть); | |||||
} | |||||
// Неизвестное. | |||||
else | |||||
{ | |||||
console.error("неизвестная пара ключ/значение", ключ, значение); | |||||
} | |||||
} | |||||
}; | |||||
@@ -0,0 +1,52 @@ | |||||
var json = { | |||||
вывести: function(аргумент) { | |||||
console.debug('выводим аргумент:', аргумент); | |||||
}.toString(), | |||||
пример: function(аргумент) { | |||||
мир.вывести("уга"); | |||||
console.debug("функция-пример исполнена. аргумент:", аргумент); | |||||
}.toString(), | |||||
набор: { | |||||
проба: function() { | |||||
console.debug("это проба"); | |||||
}.toString(), | |||||
простоСтрока: "уппамам", | |||||
глубже: { | |||||
ещё: { | |||||
функция9на12: function(аргумент) { | |||||
console.debug("функция9на12", аргумент); | |||||
}.toString(), | |||||
опятьСтрока: "ого", | |||||
}, | |||||
}, | |||||
}, | |||||
пусковыеФункции: [ | |||||
function() { | |||||
Object.defineProperty(мир, "заголовок", { | |||||
get: function() { | |||||
console.debug("да, get"); | |||||
return document.title; | |||||
}, | |||||
set: function(значение) { | |||||
console.debug("да, set"); | |||||
document.title = значение; | |||||
} | |||||
}); | |||||
}.toString(), | |||||
function() { | |||||
console.debug("заголовок-1:", мир.заголовок); | |||||
мир.заголовок = "два"; | |||||
console.debug("заголовок-2:", мир.заголовок); | |||||
}.toString(), | |||||
], | |||||
запустить: function() { | |||||
for (var номер in мир.пусковыеФункции) | |||||
{ | |||||
var функция = мир.пусковыеФункции[номер]; | |||||
функция(); | |||||
} | |||||
}.toString(), | |||||
}; | |||||
мир.разобрать(json); | |||||
мир.запустить(); |
@@ -17,121 +17,7 @@ | |||||
</style> | </style> | ||||
</head> | </head> | ||||
<body> | <body> | ||||
<script> | |||||
var мир = {}; | |||||
мир.строкаПути = function(п) { | |||||
function вСтроку(ключ) { | |||||
return `["${ключ}"]`; | |||||
} | |||||
return "мир" + п.map(вСтроку).join("") + " = "; | |||||
}; | |||||
мир.создатьПуть = function(путь) { | |||||
var уровень = мир; | |||||
var длина = путь.length; | |||||
for (var i = 0; i < длина; ++i) | |||||
{ | |||||
var п = путь[i]; | |||||
if (!уровень[п]) | |||||
{ | |||||
уровень[п] = {}; | |||||
} | |||||
else | |||||
{ | |||||
уровень = уровень[п]; | |||||
} | |||||
} | |||||
}; | |||||
мир.разобрать = function(словарь, путь = []) { | |||||
for (ключ in словарь) | |||||
{ | |||||
var внутреннийПуть = путь.slice(); | |||||
внутреннийПуть.push(ключ); | |||||
var значение = словарь[ключ]; | |||||
мир.создатьПуть(внутреннийПуть); | |||||
if (typeof значение === "string") | |||||
{ | |||||
// Функция. | |||||
if (значение.startsWith("function")) | |||||
{ | |||||
var содержимое = мир.строкаПути(внутреннийПуть) + значение; | |||||
eval(содержимое); | |||||
} | |||||
// Строка. | |||||
else | |||||
{ | |||||
var содержимое = мир.строкаПути(внутреннийПуть) + '"' + значение + '"'; | |||||
eval(содержимое); | |||||
} | |||||
} | |||||
/* | |||||
// Массив. | |||||
else if (Array.isArray(значение)) | |||||
{ | |||||
console.debug("разобрать массив"); | |||||
} | |||||
*/ | |||||
// Словарь. | |||||
else if (значение === Object(значение)) | |||||
{ | |||||
мир.разобрать(значение, внутреннийПуть); | |||||
} | |||||
// Неизвестное. | |||||
else | |||||
{ | |||||
console.error("неизвестная пара ключ/значение", ключ, значение); | |||||
} | |||||
} | |||||
}; | |||||
console.debug("строки отдельно", {строки: ["a", "b", "c"]}); | |||||
var json1 = { | |||||
строки: [ | |||||
"abc", | |||||
"def", | |||||
"ghi", | |||||
{ | |||||
ключ: "uuu", | |||||
}, | |||||
], | |||||
вывести: function(аргумент) { | |||||
console.debug('выводим аргумент:', аргумент); | |||||
}.toString(), | |||||
пример: function(аргумент) { | |||||
мир.вывести("уга"); | |||||
console.debug("функция-пример исполнена. аргумент:", аргумент); | |||||
}.toString(), | |||||
набор: { | |||||
проба: function() { | |||||
console.debug("это проба"); | |||||
}.toString(), | |||||
простоСтрока: "уппамам", | |||||
глубже: { | |||||
ещё: { | |||||
функция9на12: function(аргумент) { | |||||
console.debug("функция9на12", аргумент); | |||||
}.toString(), | |||||
опятьСтрока: "ого", | |||||
}, | |||||
}, | |||||
}, | |||||
}; | |||||
json2 = JSON.stringify(json1); | |||||
console.debug("2", json2); | |||||
var json3 = JSON.parse(json2); | |||||
console.debug("3", json3); | |||||
мир.разобрать(json3); | |||||
console.debug("мир.пример", мир.пример); | |||||
мир.пример(123); | |||||
мир.вывести(77); | |||||
console.debug("мир", мир); | |||||
</script> | |||||
<script src="0001.мир.js"></script> | |||||
<script src="0100.пример.js"></script> | |||||
</body> | </body> | ||||
</html> | </html> |