Qt 5 の未来は明るいブログ

JavaScript を Qt っぽくする

Published: 2013-05-20 / Last modified: 2013-05-20

元ネタは 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.
})

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