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メソッドを再追加しますか?また、私のライブラリを使用している別のユーザーが削除できず、オーバーライドするだけの同様の種類の関数を作成することは可能ですか?どのように?