Clojurscript: расширить класс Javascript - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь использовать конкретный JavaScript каркас, который требует расширения базового класса, чтобы использовать его для приложения.

В основном я хочу сделать следующее как idiomati c ClojureScript.

class Foo extends Bar {
  constructor() { super("data") }
  method1(args) { /* do stuff */ }
}

Я пытался

(defn foo
  []
  (reify
    js/Bar
    (constructor [this] (super this "data"))
    (method1 [this args] )))

Что бы сработало, если бы я создал новый класс из Object, но, как правильно говорит shadow-cljs, «Символ js / Bar не является протоколом». Кроме того, я не хочу добавлять методы, но создаю подкласс, который наследует некоторые методы и перегружает другие.

Я думал об использовании proxy, но «ядро / прокси не определено».

Конечно, я мог бы создать экземпляр Bar и set! новых методов, но это похоже на то, чтобы отказаться и использовать язык более низкого уровня.

1 Ответ

4 голосов
/ 05 апреля 2020

CL JS не имеет встроенной поддержки class ... extends ....

Вы можете взломать его вместе с небольшим количеством шаблонов, которые вы можете сгенерировать с помощью макроса, чтобы он выглядел красиво.

(ns your.app
  (:require
    [goog.object :as gobj]
    ["something" :refer (Bar)]))

(defn Foo
  {:jsdoc ["@constructor"]}
  []
  (this-as this
    (.call Bar this "data")
    ;; other constructor work
    this))

(gobj/extend
  (.-prototype Foo)
  (.-prototype Bar)
  ;; defining x.foo(arg) method
  #js {:foo (fn [arg]
              (this-as this
                ;; this is Foo instance
                ))})
...