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;

获得原型有点棘手。在支持 ECMAScript 5 的浏览器中,您可以使用Object.getPrototypeOf [MDN]

var proto = Object.getPrototypeOf(this);

在较旧的浏览器中,可能可以通过非标准 __proto__ [MDN]属性获取它:

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 回答