@vasIvas

Как быть, если callback'y подменяют контекст ( заурядное и OOP решение )?

function Two(){
	One.call(this);
}

Two.prototype = Object.create(One.prototype);
Two.prototype.constructor = Two;

Two.prototype = {
	setParams: function(num){
		this.prop = num
	},
	prop: null
}

var two = new Two();
two.setParams(1);
console.log(two.prop);

Есть модуль, куда нужно передавать callback, чтобы получать данные о файловой системе.
Я создал объект, который должен был обрабатывать данные, в методе, который и передается в качестве callback'a ( у меня это метод setParams ). Но получилось так, что модуль передающий параметры в callback заменяет ему контекст и следовательно this уже не работает.

И от сюда у меня сразу два вопроса -
1) Как это обойти?
2) Как это обойти наиболее грамотно ( я уверен, что для таких случаев придумали patterns, объясните на словах, как они называются, я штурману книги и потом ещё вопросов задам, как именно их применить )?

Спасибо.
  • Вопрос задан
  • 2396 просмотров
Решения вопроса 1
Petroveg
@Petroveg
Миром правят маленькие с#@&ки
А можно мне пояснить эту конструкцию?

function One(){
	// Очевидно, устанавливает this свойства и методы
}
function Two(){
	One.call(this);
}
Two.prototype = Object.create(One.prototype);
Two.prototype = {
	setParams: function (num) {
		this.prop = num;
	},
	prop: null
};


Что мне непонятно:
1. Точно ли нужно в каждый объект new Two() писать собственные методы? Может, проще-таки наследовать от прототипа One? Но тогда подход к созданию должен быть другим.

2. Зачем мы сослались на прототип One и тут же затерли эту ссылку?

Если бы я хотел унаследовать от One и дописать своё в Two, то поступил бы по-другому:

function One(){}
function Two(){}
function F(options) {
	for (var i in options) {
		if (options.hasOwnProperty(i)) {
			this[i] = options[i];
		}
	}
}

One.prototype = {
	// наследуемые свойства и методы
};
F.prototype = One.prototype;
Two.prototype = new F({
	setParams: function (num) {
		this.prop = num;
	},
	prop: null
});


Что же насчёт вопроса — покажите код с передачей callback.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
akarin
@akarin
>1) Как это обойти?
"Привязать" this к другому контексту
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы