1
Constructor1=function(){};
Constructor1.prototype.function1=function this_function()
{
  // Suppose this function was called by the lines after this code block
  // this_function - this function
  // this - the object that this function was called from, i.e. object1
  // ??? - the prototype that this function is in, i.e. Constructor1.prototype
}
Constructor2=function(){};
Constructor2.prototype=Object.create(Constructor1.prototype);
Constructor2.prototype.constructor=Constructor2;
object1=new Constructor2();
object1.function1();

コンストラクターの名前を知らずに最後の参照(???で示される)を取得するにはどうすればよいですか?

たとえば、プロトタイプのチェーンから継承するオブジェクトがあったとします。メソッドを呼び出すときに、どのプロトタイプが使用されているかを知ることができますか?

どちらも理論的には可能のようですが、一定数を超える代入ステートメントがないと機能する方法を見つけることができません(そのような関数がたくさんある場合)。

4

1 に答える 1

0

constructor各関数のプロトタイプには、プロパティ[MDN]を介して関数への参照があります。したがって、次の方法でコンストラクター関数を取得できます。

var Constr = this.constructor;

プロトタイプの入手は少し難しいです。Object.getPrototypeOf ECMAScript 5をサポートするブラウザーでは、 [MDN]を使用できます。

var proto = Object.getPrototypeOf(this);

古いブラウザでは、非標準の[MDN]プロパティを介して取得できる場合があります。 __proto__

var proto = this.__proto__;

メソッドを呼び出すときに、どのプロトタイプが使用されているかを知ることができますか?

はい、ブラウザがES5をサポートしている場合は可能です。Object.getPrototypeOf()次に、そのプロパティを持つオブジェクトが見つかるまで、繰り返し呼び出す必要があります。例えば:

function get_prototype_containing(object, property) {
    do {
        if(object.hasOwnProperty(property)) {
            break;
        }
        object = Object.getPrototypeOf(object);
    }
    while(object.constructor !== window.Object);

    // `object` is the prototype that contains `property`
    return object;
}

// somewhere else
var proto = get_prototype_containing(this, 'function1');
于 2012-07-19T10:46:27.113 に答える