Как определить объект, для которого предназначена функция? - PullRequest
1 голос
/ 22 ноября 2008
var A = {
    x : function () { }
};

var b = function (method) {
    //want to know method's "parent" here
};

b(A.x);

Я хочу знать, что x определен в A, когда я вызываю b (A.x). Возможно ли это?

Ответы [ 4 ]

4 голосов
/ 22 ноября 2008

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

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

x.parent = A;

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

x.call(x.parent);

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

2 голосов
/ 23 ноября 2008

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

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 установлены на b.

Метод

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

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

2 голосов
/ 22 ноября 2008

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

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

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

0 голосов
/ 22 ноября 2008

Каждая функция в JavaScript на самом деле является объектом Function.

<html>
<body>
<script>
var A = {
    x: function (a_a, a_b) { alert(a_a + a_b);  }
};

var b = function (a_method) {
    alert(a_method.toString());
    a_method.call(this, 1, 2);
};

b(A.x);
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...