Может ли функция JavaScript ссылаться на прототип в цепочке прототипов, из которой она была вызвана?
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 ответ
Прототип каждой функции имеет ссылку на функцию через 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');