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.
})

対処療法的ではありますが、おもしろい試みですね。

おすすめ