3

Object._ proto _ instanceof Functionで false が返されるのはなぜですか?

alert(Object.__proto__ ); //  clearly Object.__proto__ is a function right?
alert(typeof Object.__proto__); // clearly Object.__proto__ is a function right?
alert(Object.__proto__ instanceof Function); // !
4

4 に答える 4

4

すべての関数がFunctionコンストラクター経由で作成されるわけではありません。指定された項目がその特定の関数instanceofによって作成されたかどうかを明確にチェックします。

複数のウィンドウを扱う場合、ブラウザー環境でも同様の効果が得られます。fooつまり、ウィンドウ Aに機能がある場合:

function foo(arg) {
    if (arg instanceof Array) {
        // It's an array, do something
    }
}

...そして、それを呼び出す別のウィンドウB にコードがあります。

opener.foo([]);

...では、それが配列であることfooに気付くと思いますよね? argしかし、配列ではありますが、ウィンドウ内のコンストラクターによって作成されたものではないarg ためArray、そうではありませんfoo

ここに何があるかを理解することについての詳細:何を言う?

もしあなたがこのことに興味を持っているなら (あなたがそうであるように)、仕様を読むことに勝るものはありません。はい、散文は...乾いています...そして用語は....密集しています...しかし、根底にある仕組みについて学べば学ぶほど、ますます面白くなります。


トピック__proto__外 :非標準であり、すべての JavaScript 実装でサポートされていないことに注意してください。

于 2011-05-11T12:12:06.103 に答える
3

謎を締めくくるには:

正確には何Object.__proto__ですか?

  • これは単にFunction.prototypeオブジェクトへの参照です。

    Object.__proto__ === Function.prototype; // true
    

ほとんどすべての組み込み関数およびユーザー定義関数としてのObjectコンストラクターは、 から継承されます。Function.prototype

このオブジェクト ( Function.prototype) は、仕様ではFunction オブジェクトであると説明されていますが、明らかに、オブジェクトはそれ自体から継承することはできず、それObject.protoypeが代わりに継承する理由です。

あなたのテスト:

Object.__proto__ instanceof Function;   // false, which is equivalent to:
Function.prototype instanceof Function; // false

Function.prototypeオブジェクトがそれ自体のプロトタイプ チェーン上にないことを示しているだけです。Function.prototype

Function.prototype.isPrototypeOf(Function.prototype); // false, equivalent to:
Object.prototype.isPrototypeOf.call(Function.prototype, Function.prototype);

前に言ったように、仕様では、このオブジェクトは次の特性で説明されています。興味がある場合:

  • これは関数オブジェクトです ([[Call]]内部メソッドを実装します)。

    typeof Function.prototype; // "function"
    
  • その[[Class]]内部プロパティの値は です"Function"

    Object.prototype.toString.call(Function.prototype); // "[object Function]"
    
  • その[[Prototype]]内部プロパティの値はObject.prototype(ご存じのとおり) を指しています。

    Object.prototype.isPrototypeOf(Function.prototype); // true
    
  • 任意の数の引数で呼び出すことができます。

  • 常にundefined値を返します。

  • そのlengthプロパティは0です。

  • [[Extensible]]内部プロパティの初期値は ですtrue

于 2011-05-12T18:27:03.730 に答える
2
alert(Object.__proto__ ); //  clearly Object.__proto__ is a function right?
alert(typeof Object.__proto__); // clearly Object.__proto__ is a function right?
alert(Object.__proto__ instanceof Function); // !

まさに、関数です。ただし、関数オブジェクトではありません。そのため、instanceof は false を返します。instanceof のすべてをここで読むことができます。

于 2011-05-11T12:10:55.490 に答える
0

この投稿の画像は、関数とオブジェクトの関係を理解するのに役立ちます

JavaScript オブジェクトのレイアウト

于 2011-05-11T12:13:39.107 に答える