JavaScript函数可以引用它所调用的原型链上的原型吗?

时间:2012-07-19 10:41:21

标签: javascript function constructor prototypal-inheritance

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();

如何在不知道构造函数名称的情况下检索最后一个引用(由???表示)?

例如,假设我有一个继承自原型链的对象。当我在其上调用方法时,我可以知道使用了哪个原型吗?

从理论上讲,两者似乎都是可能的,但是我找不到任何方法,只需要一定数量的赋值语句(如果我有很多这样的函数)。

1 个答案:

答案 0 :(得分:0)

每个函数的原型都有一个通过constructor property [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');