2012-07-09 5 views
6

デフォルト/グローバル関数を復元しますdocument.openを元の機能に戻してください。これは可能ですか(ユーザーが作成した一時的な記憶はありません)? document.openはあまり知られていない名前の別の場所に格納されていますか?ありがとうございました! :)JSは、これは仮定の質問です、それは本当に実用的な用途を持っていませんが、...</p> <p>は、あなたがやっていたとしましょう

答えて

1
var temp = document.open; 
document.open = null; 

をして、あなたが

document.open = temp; 
+1

興味深い - あなたは一時がないとしましょう!別の方法がありますか? –

+0

何らかの方法で参照を作成する必要があります。即座に自己実行匿名関数を実行する引数としてdocument.openを渡す – fcalderan

+1

ブラウザが2番目の参照をそれ自身で保存しているかどうか私は主に考えていた –

9

document.openを上書きして、元の機能を回復することはdocumentオブジェクトに直接openという名前の変数/関数を作成します。しかし、元の関数はオブジェクト自体ではなくプロトタイプであったため、実際に復元することができます。

openの機能はHTMLDocument.prototypeです。したがって、HTMLDocument.prototype.openを使用してアクセスできます。

にそれを使用するオブジェクトを指定するために.call()を使用し、直接それを呼び出すために:あなたは、単にそれを割り当てることにより、document.openにそれを復元することができ

HTMLDocument.prototype.open.call(document, ...); 

しかし
document.open = HTMLDocument.prototype.open; 

HTMLDocumentということを覚えていますしたがってdocumentはホストオブジェクトであり、通常はそれらを混乱させないようにすることをお勧めします。特に、IEの場合は、そうしてしまえば結構です。

+0

Ahah!知ってよかった、ありがとう! :) あなたの編集に応じて...魅力的!私はこれを知らなかった、情報のためにもう一度あなたに感謝!私が –

+0

知りたいことができるようになるとすぐにこれを受け入れるでしょう:+1 – fcalderan

+1

「アラート」のようなことをどうしたらいいですか?つまり、カスタム関数を使って 'window.alert'をオーバーライドするのはかなり簡単ですが、ロールバックは一時参照を保持しなければ難しいです:http://jsfiddle.net/ovfiddle/kcLBd/ –

4
delete document.open; 

それは直感的ではありませんが、カスタマイズされた機能にDELETEキーワードを使用すると、少なくとも同じ長プロトタイプが上書きされていないとして、本来の機能を回復します。

例:

> console.log 
function log() { [native code] } 

> console.log = function() { } 
function() { } 

> console.log("Hello world"); 
undefined 

> delete console.log; 
true 

> console.log("Hello world"); 
Hello world 

はdocument.openおよびその他の組み込み関数と同じように動作します。

+0

'delete alert'と' delete window.alert'の両方が失敗し、 'window.alert = window.prototype.alert'がhttp://jsfiddle.net/ovfiddle/kcLBdで失敗するのと同じように失敗します。それ以外に、素晴らしい答え。 – 7vujy0f0hy

関連する問題

 関連する問題