LINUX.ORG.RU

[javascript][ООП головного мозга] callback на метод объекта

 


0

1

Дорогие друзья.

Хочется передать в качестве параметра конструктора объекта метод другого объекта, чтобы была возможность вызова этого метода позже, но в контексте объекта-хозяина метода. Как это можно проще сделать? Пока что придумал только регистрацию b в глобальном неймспейсе и вызова его через eval... можно ли как-то изящнее это решить?

Зараннее спасибо.

       A = function(_callback) {
		this.m_callback = _callback;
		this.m_val = "a";

		this.callCallback = function() {
			this.m_callback();
		}
	}

	B = function() {
		this.m_val = "b";
		
		this.showMyVal = function() {
			alert(this.m_val);
		}
	}
	
	b = new B();
	a = new A(b.showMyVal);
	a.callCallback(); // показывает "a", то есть вызывается в конексте a. Хочется чтобы вызывался в конексте b.

Если вот так изменить «конструкторы»:

var self=this;
this.callCallback = function() {
    self.m_callback();
}
будет работать приблизительно как вы хотите. Но по сути получится совсем «ООП головного мозга»

anonymous
()
b = new B();
a = new A(function() {
    b.showMyVal();
});

Либо, передавать еще и сам 'b' в конструктор, и из А вызывть callback так:

b = new B();
this.callCallback = function() {
    this.m_callback.apply(b_instance);
}

anonymous
()
Ответ на: комментарий от anonymous

рекомендуется называть не self, а that :)

var that = this;

в наш прогрессивный век, когда код на js измеряется мегабайтами, это (that=this) уже стало традицией :)

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs
#!/usr/bin/env node
this.hw = '您好世界';
這 = this;
console.log(這.hw);

^___^

anonymous
()

> чтобы была возможность вызова этого метода позже, но в контексте объекта-хозяина метода

Не уверен, что понял задачу правильно, но в памяти появились методы call/apply у объекта функции.

AlexKiriukha ★★★★
()
A = function(_callback, obj) {
    this.m_callback = _callback;
    this.m_val = "a";

    this.callCallback = function() {
        this.m_callback.call(obj);
    }
}

B = function() {
    this.m_val = "b";

    this.showMyVal = function() {
	alert(this.m_val);
    }
}

b = new B();
a = new A(b.showMyVal, b);
a.callCallback()

Может это подойдёт.

AlexKiriukha ★★★★
()

Спасибо всем большое, то что нужно!

LORd
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.