@@ -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> | |||
</head> | |||
<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> | |||
</html> |