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();
如何在不知道构造函数名称的情况下检索最后一个引用(由???表示)?
例如,假设我有一个继承自原型链的对象。当我在其上调用方法时,我可以知道使用了哪个原型吗?
从理论上讲,两者似乎都是可能的,但是我找不到任何方法,只需要一定数量的赋值语句(如果我有很多这样的函数)。
答案 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');