Напишите код (или опишите принцип), который бы запретил выполнение любого метода любой функции кроме заданного. Например кроме console.log.
// Ваш код
{
// внутри этого блока можно вызвать ТОЛЬКО console.log
// и не существует никакой возможности вызвать что-то еще
console.log("Start"); // Работает как ожидается
alert("Yo"); // игнорируется
new Promise(); // игнорируется
setTimeout( ()=>{}); // игнорируется
console.log("End"); // Работает как ожидается
}
Решение задачи возможно в non strict mode, с использование with и Proxy:
var theWhiteList = {
console
// , Promise
// , setTimeout
// , alert
};
var doNope = function(){};
var theObj = new Proxy(
theWhiteList
, {
get: ()=> doNope
, has: (theObj, theKey)=>!( theObj[theKey] )
}
);
with ( theObj )
{
console.log("Start"); // Работает как ожидается
alert("Yo"); // игнорируется
new Promise(); // игнорируется
setTimeout( ()=>{ console.log("time"); }); // игнорируется
console.log("End"); // Работает как ожидается
}Обозначенный выше proof of concept легко адаптируется не только для функциональных обьектов, но и для идентификаторов связанных с прочими типами.
В настоящий момент в спецификацию продвигают
Shadow Realm, которые позволят создавать подобные песочницы намного более простым способом. А так же активно обсуждается тема адаптации with для
use strictwith - это единсвенный способ прямой манипуляции контекстом исполнения.Для чего использовались подобные решения?
для создания песочниц, где необходимо было наложить ограничения на выполнение кода третьих лиц.