2011-12-24 5 views
4

私はGoogle Chromeの16.0.912.63を使用していますし、次のコードを持っている:未定義の動作が他の変数と異なるのはなぜですか?

__defineGetter__('x', function(){ 
    console.log('In Getter: x'); return 1; 
}); 

__defineGetter__('undefined', function(){ 
    console.log('In Getter: undefined'); return 2; 
}); 

console.log(x); 
console.log(undefined); 

xためのゲッター機能が正しく入力されていますが、未定義のgetterが入力されることはありません。私のコンソールにログインし、出力は次のようになります。

In Getter: x 
1 
undefined 

私はundefinedは、他のグローバル変数と同じように振る舞うという印象の下に常にでした。私はとても異なっているかについてundefinedそれができない(少なくとも私のブラウザで)ゲッターを持つようになりますこと、書類など

undefined = 10; 
undefined = null; 
undefined = 'defined'; 

がすべて有効であることを知っています。

JSFiddle

+1

jsFiddleでは動作しませんが、コンソールにペーストすると動作します。 – pimvdb

+1

@pimvdb:コンソール評価されたコードは 'with(console)'ブロックの中にラップされているので、 'console.undefined'というプロパティを定義しているからです。 – Ryan

答えて

3

それはちょうど、少なくともFirefoxとChromeで、ふりをする、任意の通常の変数のように動作しません。試してみてください:

これはreadonlyプロパティとよく似ていますが、書き込み時にはエラーが発生しません。

+1

これは、デバッグの欲求不満を導入する楽しい方法のように思えます。= /ああ、+1は質問したことのない質問に答えるためです。 =) –

+0

Chromeでfalseを返します... – pimvdb

+0

@pimvdb:Chromeでテストしていますが、「true」と評価されています。 – Ryan

2

__defineGetter__が黙って失敗するようです。 Object.definePropertyでエラーが発生します:

redefine_disallowed 

あなたがChromeでこれを呼び出すとき:

Object.defineProperty(window, "undefined", { 
    get: function() { 
     return 2; 
    } 
}); 

を一方:

window.__defineGetter__("undefined", function() { 
    return 2; 
}); 

window.__lookupGetter__("undefined"); // undefined, so __defineGetter__ just ignored call 

それがChromeのコンソールで働く理由:

あなたがefine コンソールにコードを貼り付けるときconsole._commandLineAPIを参照withブロックを使用して実行されている舞台裏でいくつかの機能があるので、それは動作しますが、一度にundefinedを取得:

if (injectCommandLineAPI && inspectedWindow.console) { 
    inspectedWindow.console._commandLineAPI = new CommandLineAPI(
     this._commandLineAPIImpl, 
     isEvalOnCallFrame ? object : null 
    ); 
    expression = "with ((window && window.console && window.console._commandLineAPI) || {}) {\n" + expression + "\n}"; 
} 
return evalFunction.call(object, expression); 

だから、あなたがしていますちょうどconsole._commandLineAPI.undefinedを定義する。

それはあなたが定義した場合に動作しundefined 2などのコマンドを取得していないので、ゲッターはあなたがundefinedを取得しようとする時間によって上書きによって捨てられてきたので、もう一つのポイントは、(コードの上を参照)、それはconsole._commandLineAPIを上書きするということです。

これに加えて、window.undefinedを上書きしないという事実は、おそらくコンソールで動作する理由です。

+0

うーん...面白いです。さて、 '__ * etter__'メソッドは、私が推測する理由で廃止されました:) +1 – Ryan

関連する問題