Jump to content
  • 0

Передача параметров


LokiDi L0ck
 Share

Question

function setSpanClick(){
//как же получить значение this.array[i]
//как же получить значение свойств/методов obj()
}

function func(){
for(i = 0; i < spans.length; i++) {
this.array[i] = {
id: "индетификатор"+i,
name: "имя"+i
};
spans[i].onclick = this.setSpanClick;
}
}

function obj(){
this.array = [];
this.func = func;
this.setSpanClick = setSpanClick;
}

var object = new obj();

Как и ожидается, setSpanClick получает указатель this на spans, но в данном случае это меня не интересует. Вопрос: как в setSpanClick можно дотянуться до методов/свойств obj() и конкретному хэшу this.array.

Link to comment
Share on other sites

15 answers to this question

Recommended Posts

  • 0
Вопрос: как в setSpanClick можно дотянуться до методов/свойств obj() и конкретному хэшу this.array.

1. так как obj() - это функция конструктор, то var MyObject = new obj();

2. передать непосредственно ссылку на сам объект: spans.onclick = function() {setSpanClick(object);};

Link to comment
Share on other sites

  • 0

function func() {
var i = 0,
len = spans.length,
thisObj = this;
for (; i < len; i++) {
this.array[i] = {
id: "индетификатор"+i,
name: "имя"+i
};
spans[i].onclick = function () {
thisObj.setSpanClick();
}
}
}

Если так, то в setSpanClick теперь "дотянуться до методов/свойств obj()" можно, как и стоит ожидать, через ключевое слово this.

Link to comment
Share on other sites

  • 0

Yarik Voronov, да, этот вариант один из самых л?гких. Но он зависит от того, как назовут новый объект - это не очень хорошо. Вс? должно осуществляться без знания этих нюансов.

2AKS, да, действительно. Пока это самый оптимальный вариант (Не люблю анонимные функции, потому чуть-чуть код изменил =)).

=====================

После ряда экспериментов, выяснилось, что без анонимной функции не обойтись... =(

=====================

После очередного ряда экспериментов, добиться желаемого не получилось.

Да, мы получили указатель this внутри setSpanClick() на obj(), но невозможно оттуда же выцепить и this.array.

По задумке (в качестве вышепривед?нного примера), в setSpanClick() должны назначаться события alert() каждому span'у, прокручиваемых в func()

function setSpanClick(){
//как же получить значение this.array[i]
alert(this.array[i].name); //при клике по соответствующим спанам, вылезает окно - Имя1, Имя2 и т.д.

//а так же вместе с этим нужно иметь доступ к свойствам/методам obj()
}

Проблема в том, что указателю this можно присвоить только один объект, поэтому до другого дотянуться не получается (если в this переда?м this.array, то дотягиваемся до него, и не дотягиваемся до методов obj() - и наоборот).

Наш?л такой метод как apply и call, пока не разобрался как они работают, но кажется с их помощью что-то должно получиться.

Link to comment
Share on other sites

  • 0
Да, мы получили указатель this внутри setSpanClick() на obj(), но невозможно оттуда же выцепить и this.array.

По задумке (в качестве вышепривед?нного примера), в setSpanClick() должны назначаться события alert() каждому span'у, прокручиваемых в func().

Нужна ссылка на span? Тогда так:

 spans[i].onclick = function () {
thisObj.setSpanClick(this);
}

Тогда в setSpanClick(arg) первым агументом - span, по которому "кликнули"...

Если нужно обязательно получить в setSpanClick() this.array (точнее нужно лишь иметь i, ведь this.array доступен), то нужно что-то, типа такого:

function applyHandler(n) {
var thisObj = this;
return function () { thisObj.setSpanClick(n); };
}

тогда в конструкторе надо добавить еще метод:

function obj(){
/* .... */
this.applyHandler = applyHandler;
}

, а в цикле со спанами уже так:

spans[i].onclick = this.applyHandler(i);

Что-то, вроде такого - должно все получиться...

Link to comment
Share on other sites

  • 0

2AKS, мегамозг :)

Вс? заработало как часы, благодарю. Теперь буду сидеть вникать, как в этих конструкциях вс? переда?тся).

p.s. В целях самообразования, что возращает return function () { thisObj.setSpanClick(n); }; - указатель на функцию?..

Link to comment
Share on other sites

  • 0
...мегамозг :)

Да какой мозг - у других подсмотрел. :)

...что возращает return function () { thisObj.setSpanClick(n); }; - указатель на функцию?

Объект типа Function (в данном случае function-expression), а "указателем" на нее будет св-во span'а - onclick.

Link to comment
Share on other sites

  • 0

Стоило почитать ответ и глянуть после этого код, как вс? встало на свои места)))

В общем по таким вопросам больше беспокоить не буду, просто мо? мышление унаследовано от других языков программирования, некоторые аспекты в js ещ? не знаю.

Link to comment
Share on other sites

  • 0

Не совсем переключатель.

Привед?нный пример кода состряпал создавая тему - это просто малая схема вырванная из контекста более объ?много кода, с которой у меня возникла проблема.

Link to comment
Share on other sites

  • 0

Господа, прочитал все. А что нам мешает сделать так:

function func(){
var thisObj = this;
/*...*/
spans[i].index = i;
spans[i].onclick = function () {thisObj.setSpanClick(this);};
}
function setSpanClick(){
var a = setSpanClick.arguments;
alert ([this.array[a[0].index]['id'], a[0], a[0].index]);
}

?

В setSpanClick в .arguments[0] получаем ссылку на span, a span имеет атрибут index равный индексу i в this.array[ ]

Ежели нужно только значение i в this.array[ ]:

spans[i].index = i;
spans[i].onclick = function () {thisObj.setSpanClick(this.index);};

Link to comment
Share on other sites

  • 0

Я бы сделал так:

function setSpanClick()
{
//как же получить значение this.array[i]
//как же получить значение свойств/методов obj()
var object = this.pObject;
// теперь можем получить все, что угодно
}

function func()
{
for(i = 0; i < spans.length; i++) {
this.array[i] = {
id: "индетификатор"+i,
name: "имя"+i
};
spans[i].onclick = this.setSpanClick;
spans[i].pObject = this;
}
}

function obj()
{
this.array = [];
this.func = func;
this.setSpanClick = setSpanClick;
}

var object = new obj();

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy