3

組み込みでないグローバルのみをコンソールにダンプするブックマークレットを作成しようとしています。window.Audioやその他の組み込み関数で、toString()が「[objectFunction]」を返すことがわかりました。

.toString()をオーバーライドせずに.toString()が「[objectFunction]」を返す関数を作成することは可能ですか(意味がありますか?)つまり、「」をスキップするために非組み込みをスキップすることは可能ですか? [オブジェクト関数]」の?

この質問は私のブックマークを磨こうとしている私の一部です:https ://gist.github.com/4635185

4

1 に答える 1

4

()とwindow.Audioは異なるtoStringメソッドがあるため 、他のsまたはsメソッドは上書きされ、返される可能性があります。Object
Audio.toString === Object.toString //false
functionObjecttoString[object Function]

今、人々は走り回ったり、関数メソッドを上書きしたりしないのでtoString、このアプローチで本当にうまくいくかもしれません。しかし、デバッグ上の理由などで、誰かがこれを行うことを決定する場合があります。

アップデート:

ささいなECMAScript5のソリューションも可能です(互換性

(function () {
    var keys = Object.keys(window),
        r = {};
    for (var i = 0, j; j = keys[i]; i++) {
        r[j] = window[j];
    }
    console.dir(r);
})();

編集:

ありがたいことに、最後の回答が正しく機能しなかったことを指摘しました(私が何を考えていたのかさえわかりません)

とにかく、別のアプローチは

  • 新しい空のIframeを作成します(about:blank)
  • すべてのwindowプロパティを取得最初から含まれているプロパティ
  • 他のすべてをアレイにプッシュします

function getNonNatives(window) {
var iframe = document.createElement("iframe");
iframe.src = "about:blank";
document.body.appendChild(iframe);
var natives = iframe.contentWindow,nonnatives = {};
for(var prop in window)
  if(!natives[prop] && window[prop] !== null)
    nonnatives[prop] = window[prop];
document.body.removeChild(iframe);
  return nonnatives;
};
console.log(getNonNatives(window));

toStringこのように、誰かがObjects / Functionsメソッドをオーバーライドする場合でも、気にする必要はありません。

読みやすくするために、この編集には古いコードを含めません

コメント

コメントの質問に答えるに!!~は:

~、オペランドのビットを反転するビット単位のNOT演算子です。

したがって、このロジックを指定すると、正の数以外に何も見つからない場合 に返されるためindexOf、何かが見つかったかどうかを確認するための省略形として使用できます。
-1

~-1 == 0と例えば~4 == -5

次に!!、ブール値に変換するために使用されます

!!0 == false!!-5 == true

基本的にはその省略形です

if( myString.indexOf("myValue") > -1)

于 2013-01-29T15:45:31.283 に答える