Может ли функция 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');
Другие вопросы по тегам