2008-11-22 2 views

ответ

4

Нет никакого хорошего встроенного способа сделать это, потому что на самом деле в Javascript нет методов. Они являются независимыми объектами функции, которые просто где-то назначаются.

Если вы создаете новый экземпляр функции каждый раз, когда (например, закрытие) [спасибо Мэтью Крамли за указание, что из], то вы можете изменить объект функции явным образом связать его с родительским:

x.parent = A; 

, а затем вы можете назвать это правильно, как если бы это был метод:

x.call(x.parent); 

в противном случае вам придется пройти как функцию и его родительский объект.

2

Этот вопрос не имеет смысла с точки зрения языка как функции могут существовать на многих объектах.

var a = { name : 'a' }, 
    b = { name : 'b' }, 
    c = { name : 'c' }; 
a.x = function() { alert(this.name); }; 
c.x = b.x = a.x; // a, b, and c all reference the same function 

Вы можете вызвать x функцию с любого контекста вы хотите:

a.x(); // alerts "a" because "this" is object a 
b.x(); // alerts "b" because "this" is object b 
a.x.call(b); // alerts "b" because "this" is object b (via parameter) 

Вы можете управлять этим поведением, чтобы работать для вас:

var b = function (method) { 
    // parent = this; 
}; 
b.call(A, A.x); 

Существует, однако, не каким-либо образом зная изнутри функцию, какой объект ей назначен, поскольку это не обязательно одно место.

2

Даже добавление родительского свойства не будет работать во всех случаях, поскольку, если функция находится в прототипе объекта, существует только одна копия объекта функции, поэтому нет способа определить, из какого экземпляра она появилась. Вот пример, чтобы показать проблему:

function MyClass() { 
    // Create a MyClass object 
} 
MyClass.prototype.x = function() { return 42; }; 

var a = new MyClass(); 
a.x.parent = a; // Set the parent to a 

var b = new MyClass(); 
b.x.parent = b; // b.x and a.x both reference the same function from MyClass.prototype 

Теперь a.x.parent и b.x.parent оба установлены в б.

@ Метод porneL будет работать до тех пор, пока каждый объект получит свою собственную копию функции.

Возможно, лучше изменить функцию, чтобы взять родительский объект и метод, чтобы он работал с любой функцией.

Смежные вопросы