1

JavaScriptの削除演算子について読んで実験していました。ウィンドウオブジェクトからメソッドを削除しようとするまでは、すべて問題ないようです。コードは次のようになります

var log = function(str){
  if(str !== undefined)
  {
    document.write(str);
  }
   document.write("</br>");
};


window.myVar = function(){
  // do something
};

// this deletes custom method 
log(delete  window.myVar);  // true (expected)
log(typeof window.myVar);  // undefined (expected)

log(delete window.alert);  // true (OK)
log(typeof window.alert); // function (Unexpected)

window.alert = 10;
log(typeof window.alert);   // number (Successfully overwritten)
log(delete window.alert);  // true
log(typeof window.alert); // function (Returns back to original object)

作成したオブジェクトは削除できますが、定義済みのオブジェクトは削除できないようですが、オーバーライドできます。誰かが私にその背後にある理由を説明できますか?また、ここでも発生していないオブジェクトの削除に失敗した場合、deleteは「false」を返す必要があります。

[更新]FF19を使用しており、http://jsbin.comで実行しています。

[更新] window.alertをオーバーライドして、カスタムコードを実行する方法を理解していることに注意してください。私の質問は、window.alertの何が特別なので、削除できないのに削除がtrueを返すのかということです。私はそれがネイティブオブジェクトであることを知っていますが、それはなぜこれが不可能なのかを説明していません。コードによって削除された後、ブラウザのJavaScriptエンジンがalertメソッドを再追加しますか?また、私のライブラリを使用している別のユーザーが削除できず、オーバーライドするだけの同様の種類の関数を作成することは可能ですか?どのように?

4

1 に答える 1

1

簡単です。既存の関数を上書きすることはできますが、消去することはできません。既存の/標準関数は、削除が呼び出されると、代わりに標準プロトタイプにリセットされます。ただし、windows.alertなどの関数を無効にしたい場合は、次のような空白の関数を割り当てます。

window.alert = function(){}; //blank function makes window.alert now useless 

コンソール(ブラウザ)ベースのスクリプトを試してください。

window.alert = function(data){
    console.log('alerting:'+data)
}; 
window.alert('hi'); // this will print "alerting:hi" in console
delete window.alert
window.alert('hi'); // now this will show regular alert message box with "hi" in it

これがそれを説明することを願っています。

アップデート:

標準関数の「アラート」を上書きしたいとします。

//this function will append the data recieved to a HTML element with 
// ID message-div instead of showing browser alert popup
window.alert = function(data){
    document.getElementById('message-div').innerHTML = data;
}
alert('Saved Successfully'); //usage as usual
...
//when you no longer need custom alert then you revert to standard with statement below
delete window.alert;
于 2013-02-21T08:50:09.410 に答える