#_だわん このページをアンテナに追加 RSSフィード

2006-04-07

playerを手にいれた! playerを手にいれた! - #_だわん を含むブックマーク

昨日、playerオブジェクトが欲しいと書いた通り、redcherryさんとお話したり、d:id:redcherry:20060405:p3トラックバックしたりされたりした訳ですが、そのおかげで閃いた。というか過去にちょっと思いつきつつも試さずにいた事を思い出した。

というわけで試してみたら無事成功(だと思う)

なにをやったかというと、Playerオブジェクトコンストラクタラッパーを作って、そのラッパーコンストラクタをオーバーライドしました。

以下にそのサンプルスクリプトを載せます。

// ==UserScript==
// @name        Print unsafeWindow content
// @namespace   http://d.hatena.ne.jp/TransFreeBSD/
// @description Print unsafeWindow content
// @include     http://world.hatelabo.jp/*
// @exclude     http://world.hatelabo.jp/help
// @exclude     http://world.hatelabo.jp/js/*
// ==/UserScript==
var PlayerOrig = unsafeWindow.Player;
unsafeWindow.Player = function(map, name, friendList) {
    GM_log("make player: begin");
    GM_log("name: " + name);
    var obj = new PlayerOrig(map, name, friendList);
    GM_log("make player: done");
    return obj;
}

javascriptではすべてがオブジェクトの様に扱われ、関数すら変数への代入が出来ちゃいます*1。そこで、元のコンストラクタ変数に退避したあと、それにラッパーを再代入し、そのラッパーでは退避した本来のコンストラクタを呼び出してオブジェクトを作り、それを返してやります。サンプルスクリプトではそのオブジェクトはグローバルには残していませんが、グローバル変数に残してやればあとから参照出来るはず。

そんな関数すら自由にいじれるjavascript仕様感謝

*1:見方を変えていえば、名前のある変数に代入した関数が名前のついた関数といえる

ゲスト



トラックバック - http://dogfood.g.hatena.ne.jp/TransFreeBSD/20060407