Это не так красиво в JS, потому что вам всегда нужно ключевое слово this
, но основная часть DSL - это функциональность instance_exec
, которую очень легко сделать в JS, используя bind
, apply
или стрелочные функции.
Вместо того, чтобы использовать класс (который не поддерживает стрелочные функции), я построю новую область видимости, используя IIFE:
MyDsl = (function(){
return this;
}).apply({});
Затем я Добавим однофункциональный DSL:
MyDsl = (function(){
this.print_stuff = (arg, callback) => {
console.log(arg);
callback && callback.apply(this);
};
return this;
}).apply({});
Поскольку я определяю print_stuff
как стрелочную функцию, я гарантирую , что внутри него this
всегда будет ссылаться на MyDsl
.
Затем я могу использовать DSL следующим образом:
MyDsl.print_stuff("foo", function() {
this.print_stuff("bar");
});
Обратите внимание, что мы не можем использовать здесь функцию ошибки, потому что тогда .apply(this)
будет проигнорирован.