2015-08-29 3 views
0

Я делаю библиотеку в ClojureScript, которая откроет публичный JavaScript API. Так как он должен имитировать API существующей библиотеки JavaScript, я хотел бы представить такую ​​же беглом API:Свободный интерфейс в ClojureScript

myLib.prepareToDo() 
    .something() 
    .and('also') 
    .somethingElse() 
    .run(function(err, result) { 
     console.log("yay!"); 
}); 

В JavaScript можно создать свободно API, как этот site point):

var MyClass = function(a) { 
    this.a = a; 
} 

MyClass.prototype.foo = function(b) { 
    // Do some complex work 
    this.a += Math.cos(b); 
    return this; 
} 

затем я могу назвать это как:

var obj = new MyClass(5); 
obj.foo(1).foo(2).foo(3); 

Теперь, насколько я знаю, нет никакого понятия this в ClojureScript, хотя, видимо, это ПОСС Доступ к ней this-as.

Я не понимаю, как использовать его, хотя, следовательно, мой вопрос.

Как создать свободный интерфейс в ClojureScript?

ответ

3

(defrecord) и this answer на помощь. Расширение «магического» протокола Object нашей записи или типа заставляет определенные методы отображаться как функции-члены в объекте JavaScript. Чтобы включить «свободный интерфейс», некоторые методы возвращают экземпляр MyClass.

(defrecord MyClass [a b] 
    Object 
     (something [this] this) 
     (and-then [this s] (assoc this :a s)) 
     (something-else [this] (assoc this :b (str a "-" a))) 
     (run [this f] (f a b))) 

Тогда мы можем иметь клиент JavaScript следующим образом:

var myClass = new my_namespace.core.MyClass(); 
myClass.something() 
    .and_then("bar") 
    .something_else() 
    .run(function(a, b) { 
     console.log(a + " - " + b) }); 
Смежные вопросы