JavaScript を Qt っぽくする
元ネタは Qtified JavaScript 。
Qt Quick に移行して以来、JavaScript を使う機会が増えましたが、Qt の綺麗な API に慣れていると JavaScript の API って少し不便に感じる事があります。そのひとつが bool QList::contains(const T & value) const がないことで、今回は JavaScript にこの contains() を追加してみるとういう試みです。
Array.prototype.contains = function(e) { return this.indexOf(e) !== -1; }
と書いた qtified.js ファイルを作成し、qml ファイルの先頭で
import 'qtified.js' as JS
と書いておくと
MouseArea { anchors.fill: parent property var names: ["Egon", "Peter", "Raymond", "Waldo"] onClicked: { console.debug(names.contains('Egon')) } }
のような書き方ができるようになります。
しかし、このやり方は少しまずくて、
for (var i in names) print(i);
を実行すると以下のように表示されてしまいます。
0 1 2 3 contains
JavaScript 1.8.5 以降使用可能な Object.defineProperty を使うことでこの問題を解決することができて、qtified.js は以下のように変わります。
.pragma library Object.defineProperty(Array.prototype, "contains", { value: function(e) { return this.indexOf(e) !== -1; }, enumerable: false // This is the default and can be omitted. })
対処療法的ではありますが、おもしろい試みですね。