Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Неправильная передача объекта в массиве (https://javascript.ru/forum/events/42728-nepravilnaya-peredacha-obekta-v-massive.html)

Shpion08 07.11.2013 08:00

Неправильная передача объекта в массиве
 
При работе с "input" и "select" столкнулся с проблемой получения их свойств, если свойства запрашиваются из массива.

var doc = document,
	iType = [0, (doc.getElementById('iType').selectedIndex)],
	iSpan = [0, doc.getElementById('iSpan').value],
	...


В общем в iType передается целиком объект "Select" с id='iType', причем перебивает весь массив iType! (с input тоже самое, запрос свойства игнорирует)
А если так:
var doc = document,
	T=doc.getElementById('iType').selectedIndex,
	S=doc.getElementById('iSpan').value,
	iType = [0, T],
	iSpan = [0, S],
	...

тогда все нормально... В чем проблема???

Shpion08 07.11.2013 08:44

Так... не в этом месте теперь ошибка...
function run_up () {
var doc = document,
	T=doc.getElementById('iType').selectedIndex,
	S=doc.getElementById('iSpan').value,
	iType = [0, T],
	iSpan = [0, S],
	...

только на этой стадии все норм работает, а далее... если мы из другой функции запросим эти массивы... (в этом же модуле) то получим не значения, а опять же объекты "input" и "select". Почему они перебиваются вдруг?

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

ksa 07.11.2013 08:45

Цитата:

Сообщение от Shpion08
В чем проблема?

Бивас, тест! (с)

<select id='iType'>
	<option></option>
	<option selected>1</option>
	<option>2</option>
</select>
<input type='text' id='iSpan' value='test' />
<script type="text/javascript">
var 
	doc = document,
	iType = [0, doc.getElementById('iType').selectedIndex],
	iSpan = [0, doc.getElementById('iSpan').value]
	alert(iType[1]);
	alert(iSpan[1]);
</script>

Брехня. Все работает... :D

Shpion08 07.11.2013 11:50

Цитата:

Сообщение от ksa (Сообщение 279946)
Бивас, тест! (с)
Брехня. Все работает... :D

Ну а вы мои сообщения внимательно прочтите... я и писал что в 1 функции работает (как у вас), а если в разных... то нет!
function run_up () {
var doc = document,
    iType = [0, doc.getElementById('iType').selectedIndex],
    iSpan = [0, doc.getElementById('iSpan').value],
    };
function run(){
run_up();
alert(iType[1]);
alert(iSpan[1]);
}

Вот так не работает!

Или я тут их делаю privat а не global ?) но тогда каким макером мне их сделать глобальными? они должны записываться только по запросу... вытаскивать их в отдельный js ?

PS. сори если туплю, но javascript я изучаю можно сказать третий день только) (после delphi и c++ на javascript... где нет элементарно - классов - короче попа это :( )

ksa 07.11.2013 16:56

Цитата:

Сообщение от Shpion08
Ну а вы мои сообщения внимательно прочтите...

Ну глуп, Ваше Сиятельство, глуп... :D

Цитата:

Сообщение от Shpion08
Вот так не работает!

Так оно так и не должно работать...

Цитата:

Сообщение от Shpion08
после delphi и c++

А там "внутренние" переменные видят все остальные функции и процедуры? :D

Shpion08 08.11.2013 07:05

там можно сделать родительский класс и от него унаследовать другие...
Ну или просто все объединить в 1 класс и функции манипулирующие с переменными данного класса будут работать нормально!

danik.js 08.11.2013 07:39

Цитата:

Сообщение от Shpion08
там можно сделать родительский класс и от него унаследовать другие...

Ну а в JS можно сделать прототипом конструктора экземпляр другого конструктора, что и будет являться наследованием:

/**
 * @constructor
 */
function A() {
    this.foo = 'abc';
}
A.prototype.bar = function() {

};

/**
 * @constructor
 * @inherits A
 */
function B() {
  // вызываем конструктор A
  A.call(this);
  // теперь имеем this.foo =  'abc'
}

// Прототипом для объектов B будет новый объект, основанный на (имеющим прототипом) прототипе конструктора A
// вторым агрументом восстанавливаем свойство constructor
B.prototype = Object.create(A.prototype, {
    constructor: {value: B}
});
// теперь при вызове конструктора будем иметь this.bar = function...

Shpion08 09.11.2013 09:06

охты, интересненько) спасиб!

danik.js 09.11.2013 11:22

Я написал одно, а код делает другое. Вот код, где прототипом является экземпляр другого "класса":

/**
 * @constructor
 */
function A() {
    this.foo = 'abc';
}
A.prototype.bar = function() {
 
};
 
/**
 * @constructor
 * @inherits A
 */
function B() {
}
 
// Прототипом для объектов B будет экземпляр A
B.prototype = new A;


Это часто используется, однако свойства, созданные в A, будут в прототипе B, а значит общими для всех экземпляров B. Плюс, вызов конструктора A не всегда требуется.

Вообще же, JS не дает возможности унаследовать свойства. Это можно сделать только через вызов родительского конструктора. А конструктор помимо установки свойств может делать нежелательные действия.


Часовой пояс GMT +3, время: 14:03.