とった:
コンソールがグローバルオブジェクトのプロパティであることを証明できました。コンソールを開いて、次のように入力します。this.parent
またはwindow.parent
。これにより、自由に使用できるプロパティとメソッドのより完全なリストが表示されます。を含めconsole: Console
て、そのすぐ下の約2/3 chrome: Object
(興味深い... :))。どういうわけかコンソール自体のCSSルールを変更できたことを思い出したときにこれを考えました(クロームでは、どうやってそこにたどり着いたのか聞かないでください、思い出せません)。
結論:console
これはウィンドウオブジェクトのプロパティです。これは私の説明をかなりよく裏付けていると思います。
@Randomblue:これがv8でどのように実装されているかに興味があるので、ここでトランクをチェックするか、出血を閲覧することができます。どこかに、を処理する多数のファイルがあるテストディレクトリがありますdelete
。グローバル変数/プロパティでの使用には特別な注意が払われてdelete
います。つまり、削除することはできません。つまり、コンソールが実際になくなることはありません。なぜこの答えが役に立ったと投票されて受け入れられたのか、役に立たなかったのか受け入れられなかったのか知りたいのですが...
それは完全に簡単です。Console
ランダムなスタンドアロンのオブジェクトではありません。これは実際にはグローバルオブジェクトのプロパティです。コンソールを開き、またはと入力しthis.console === console
ますwindow.console === console
。もちろん、それは真実を記録します。
したがって、暗黙のグローバルのおかげでconsole = 0
、とほとんど同じwindow.console = 0
です。インスタンスのプロパティを再割り当てしているようなものです。通常のオブジェクトとの違いは、グローバルオブジェクトが単なる古いオブジェクトではないことです。そのプロパティは削除できません(ここではMDNのどこかにあります)。つまり、グローバルはまだ存在しているコンソールオブジェクトをマスクしているので、参照も失われています。
var bar = window.console;
console = 12;
bar.log(console);//logs 12, bar is now an alternative reference to the console object
delete console;//unmasks the console reference
console === bar;//true
しばらくの間、グローバルオブジェクトにプロトタイプがないことに騙されないでください。入力this.constructor.name
して見よWindow
、大文字W
で表示されます。ダブルチェックの別の方法は次のとおりです。Object.getPrototypeOf(this);
またはObject.getPrototypeOf(window);
。言い換えれば、考慮すべきプロトタイプがあります。いつものように、チェーンは:で終わりObject.prototype
ます
Object.getPrototypeOf(Object.getPrototypeOf(window));
要するに、ここでは奇妙なことは何も起こっていませんが、グローバルオブジェクト自体の奇妙な性質があります。ある種のプロトタイプの継承が行われているように動作します。次のように設定されているかのように、グローバルオブジェクトを確認します。
this.prototype.window = this;//<-- window is a circular reference, global obj has no name
this.prototype.console = new Console();//this is the global object
this.hasOwnProperty(console);//false
console = 0;//implied global
アクセスしようとするとconsole
、JSはオブジェクトconsole
のインスタンスの前に設定したプロパティを見つけ、Console
その値を喜んで返します。それを削除しても同じことが起こり、最初に出現したものconsole
は削除されますが、プロトタイプチェーンの上位のプロパティは変更されません。次回console
リクエストされると、JSは継承チェーンをスキャンし、古いコンソールインスタンスを返します。console-objectが実際になくなることはなく、自分で設定したプロパティの背後に隠されているだけです。
トピックから外れていますが、完全を期すために:
グローバルオブジェクトの特殊文字のために、これよりもいくつかのことがあります(オブジェクト/プロトタイプチェーン検索の前のスコープスキャン)が、これはAFAIK、の本質ですそれ。
あなたが知る必要があるのは、(少なくとも)1つのプロトタイプがなければ、オブジェクトのようなものは(JSでは)存在しないということです。これにはグローバルオブジェクトが含まれます。あなたがしていることは、現在のグローバルオブジェクトのインスタンスを拡張し、プロパティを削除するだけで、プロトタイプが再び引き継ぎます。そのような単純な。@Peeterが彼の答えでほのめかしたのは、それです。暗黙のグローバルは、グローバルオブジェクトを変更するため、厳密モードでは許可されません。私がここで説明しようとしたように、これはまさにここで起こることです。