散々探してやっと見つけた。
Inventing GObject ES6 classes | The Mad Scientist Review
なんかイッパイ手段があるみたい。
一番簡単そうな手段で試してみる。
/* btn.js */
const Gtk = imports.gi.Gtk;
const GObject = imports.gi.GObject;
var Btn = GObject.registerClass({
GTypeName: "BtnClass"
}, class Btn extends Gtk.Button {
constructor(props={}) {
super(props);
}
// function
set_button_label(txt) { this.label = txt; }
// getter
get prop() { return this.label }
});
を
#!/usr/bin/gjs
imports.gi.versions.Gtk = "3.0";
imports.searchPath.unshift('.');
const Gtk = imports.gi.Gtk;
const Btn = imports.btn;
class Test extends Gtk.Window {
constructor() {
super();
this.connect("hide", ()=> {
Gtk.main_quit();
});
this.ll = "カワイイ";
var btn = new Btn.Btn({label: "睦ちゃん"});
btn.connect("clicked", (widget)=> {
// getter
var s = widget.prop;
// function
widget.set_button_label(`${s} ${this.ll}`);
});
this.add(btn);
this.show_all();
}
}
Gtk.init(null);
let test = new Test();
Gtk.main();
で動かしてみる。
何も警告は出なくなった、思いっきり const を使っているのに。
これで安心してコード分割ができるぞい。
ただ、ちょっぴり面倒臭い。
関数定義や getter/setter は検索して一番解りやすかったページが以下。
JavaScriptにもクラスがやってきた!JavaScriptの新しいclass構文をマスターしよう | HTML5Experts.jp
コピペして console.log を print に書き換えてと。
うん gjs 1.50.2 で問題なく動くんだね。
だけど gir で継承すると…
#!/usr/bin/gjs
imports.gi.versions.Gtk = "3.0";
const Gtk = imports.gi.Gtk;
Gtk.init(null);
//* gir @ Error
class Btn extends Gtk.Button {
constructor() { super(); }
put() { print("func test"); }
}
//*/
/* no gir @ OK!
class Btn {
constructor() {}
put() { print("func test"); }
}
*/
var btn = new Btn();
btn.put();
何でや!
getter/setter も同様だった、理由が解らない。
上記のように GObject.registerClass をするしかないっぽい。
class が使えるようになって面倒になるとは思わなかったよ。

