15

オペレーターはdelete、オブジェクトからプロパティを削除します。プロパティをに設定するとwindow、削除できます。

window.myProp = 10;
delete window.myProp;

演算子の状態の動作に関して私が頻繁に他の人に言及する記事のように、これdeleteはプロパティの割り当てが属性を設定しないためDontDeleteです(変数の宣言とは対照的です)。

その記事には、次のことも記載されています(強調が追加されました)。

属性が決定されるのはプロパティの作成中であることに注意してください(つまり、何も設定されません)。後の割り当てでは、既存のプロパティの属性は変更されません。この違いを理解することが重要です。

それを念頭に置いて、なぜwindowの既存のプロパティをオーバーライドし、alertそれを削除して元の値に戻すことができるのでしょうか。明らかな何かが欠けていますか?delete演算子を使用することはめったにないので、そうなる可能性があります。

例えば:

window.alert = function() {};
alert("Hi!"); //Nothing happens

delete window.alert;
alert("Hello?"); //Alerts 'Hello?'

これは、それを実証するためのフィドルです(Chomeでのみテストされており、IEがこのように動作しないことは確かですが、現在Chrome以外にはアクセスできません)。

4

2 に答える 2

9

Chrome では、window.alert関数はクラスのプロトタイプの一部であり、それ自体のプロパティではありません。DOMWindowwindow

したがって、上書きすると新しいプロパティが にwindow.alert追加されますが、プロトタイプのバージョンは引き続き存在しますが、非表示になります。window

プロトタイプの関数がdelete window.alert再公開されると。

関数がプロトタイプにあることを示すコンソール出力を次に示します。

> window.constructor.prototype
DOMWindow

> window.constructor.prototype.alert
function alert() { [native code] }

クラス名は異なりますが、Firefox も同様に動作します。

于 2012-04-25T16:19:05.560 に答える
2

これは意図された動作であり、シャドーイングと呼ばれます。スーパークラスの機能を一掃することなく、カスタム機能を提供できます。メソッドを削除すると、カスタム メソッドが削除され、プロトタイプの元のメソッドが明らかになります。

継承を深く掘り下げ、プロトタイプの仕組みを理解すればするほど、これを行っている人々の事例を目にするようになります。

素晴らしい質問です。これは、私の経験上、ほとんどの JavaScript 開発者が頻繁に調査する分野ではありません。このようなことがなければ、JavaScript ベース オブジェクトのコア機能を拡張またはオーバーライドする多くのポリフィルは実現できなかったでしょう。

于 2012-04-25T16:19:24.473 に答える