20

次のコードがあるとします。

function a() {}
function b() {}
b.prototype = new a();
var b1 = new b();

のプロトタイプチェーンaに追加された滞在ができます。b偉大な。また、次のすべてが当てはまります。

b1 instanceof b
b1 instanceof a
b1 instanceof Object

b1私の質問は、前もっての起源がわからない場合はどうなるかということです。プロトタイプチェーンのメンバーをどのように発見できますか? [b, a, Object]理想的には、またはのような配列が必要["b", "a", "Object"]です。

これは可能ですか?SOのどこかでこれを見つける方法を説明した答えを見たことがあると思いますが、私の人生では二度と見つけることができません。

4

4 に答える 4

7

オブジェクト間のプロトタイプ リンク ( [[Prototype]]) は内部的なものであり、Mozilla などの一部の実装では、それを として公開していobj.__proto__ます。

ECMAScript 5th EditionのObject.getPrototypeOfメソッドが必要ですが、現在ほとんどの JavaScript エンジンには実装されていません。

John Resig によるこの実装constructorを見てください。これには落とし穴があります。サポートしていないエンジンのプロパティに依存しています__proto__

if ( typeof Object.getPrototypeOf !== "function" ) {
  if ( typeof "test".__proto__ === "object" ) {
    Object.getPrototypeOf = function(object){
      return object.__proto__;
    };
  } else {
    Object.getPrototypeOf = function(object){
      // May break if the constructor has been tampered with
      return object.constructor.prototype;
    };
  }
}

constructorプロパティはどのオブジェクトでも変更可能であるため、これは 100% 信頼できるわけではないことに注意してください。

于 2010-02-11T05:51:16.637 に答える
3

編集— この回答は 2010 年のもので、かなり時代遅れです。それ以来、言語にObject.getPrototypeOf()API が追加され、プロセスが大幅に簡素化されました。


オブジェクトの「コンストラクター」プロパティを使用してそこでプロトタイプを見つけ、それを虹の端に到達するまで連鎖させることができます。

function getPrototypes(o) {
  return (function gp(o, protos) {
    var c = o.constructor;
    if (c.prototype) {
      protos.push(c.prototype);
      return gp(c.prototype, protos);
    }
    return protos;
  })(o, []);
}

(たぶん)(またはそうでないかもしれません:-)ちょっと待ってください)(まあ、それは可能だと思いますが、そのコードは無視してください)

[編集] うわー、これは完全に私の心を吹き飛ばしています - その関数は近いですが、完全には正しくありません。プロトタイプの連鎖を設定するのは奇妙で、怖くて寂しいです。上記の素晴らしい @CMS だけに注意を払うことをお勧めします。

于 2010-02-11T05:43:49.167 に答える
0

これは、再帰関数呼び出しのない単純な方法です

function getProtoChain(o) {
    const ans = []
    let t = o
    while (t) {
        t = t.__proto__
        ans.push(t)
    }
    return ans
}

この関数の使用例を次に示します。

class A {}
class B extends A {}
class C extends B {}

console.log(getProtoChain(new C())) // [C: {}, B: {}, A: {}, {}, null]
于 2021-11-23T23:51:05.670 に答える