Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Прототип от прототипа (https://javascript.ru/forum/events/43456-prototip-ot-prototipa.html)

hellbeast92 06.12.2013 11:41

Прототип от прототипа
 
Всем привет! Не получается присоединить прототип к прототипу.

Допустим, у нас есть объект Slide,у которого есть метод num(номер).

var sliderMain = document.getElementById('slider-main');
	
var Slide = function(derection){
    this.dom = sliderMain.querySelectorAll('.slide_' + derection);
};
Slide.prototype.num = function(number){
    return this.dom[number-1];
};
var slideL = new Slide('left');
slideL.num(1);


Далее, я бы хотел присоединить еще один метод, к полученному объекту (slideL.num(1)), который бы вытаскивал из этого объекта его zIndex.
Как я это представляю: slideL.num(1).zIndex;

Slide.prototype.zIndex = function(){
	return (this.style.zIndex == "" ? getComputedStyle(this, '').zIndex : this.style.zIndex);
};


Но тут я натыкаюсь на то, что this = undefiend.

Помогите решить проблему и понять до конца прототипирование)
Заранее спасибо!

cyber 06.12.2013 14:30

hellbeast92, для этого нужно возвращать либо свой объект либо, писать свойство zIndex прям в ДОМ объект.
Slide.prototype.num = function(number){
  
  var obj = this.dom[number-1]
  
      obj.zIndex = this._zIndex(obj);
 
    return obj;
};

Slide.prototype._zIndex = function(obj){
    return (obj.style.zIndex == "" ? getComputedStyle(obj, '').zIndex : obj.style.zIndex);
};

hellbeast92 08.12.2013 21:24

Спасибо! очень помогли, но встал один вопрос. как будет правильней сделать (не увервен что есть разница, но мало-ли я не вижу каких-то важных моментов...):
1) использовать ваш вариант или..
2) вместо прототипной функции _zIndex илпользовать обычную функцию,
к примеру:
var fzIndex = function(obj){
  return (obj.style.zIndex == "" ? getComputedStyle(obj, '').zIndex : obj.style.zIndex);
};

и тогда вместо
obj.zIndex = this._zIndex(obj);
используем
obj.zIndex = fzIndex(obj);

cyber 08.12.2013 21:35

Slide.prototype.num = function(number){
  
  var obj = this.dom[number-1]
  
      obj.zIndex = _zIndex(obj);
 
    return obj;
};

 function _zIndex(obj){
    return (obj.style.zIndex == "" ? getComputedStyle(obj, '').zIndex : obj.style.zIndex);
};

danik.js 09.12.2013 04:23

Неужели такая большая разница:
obj.style.zIndex
vs
obj.zIndex


:blink:

...ищете приключений на свою задницу...

hellbeast92 09.12.2013 12:57

Разница в том, что obj.style.zIndex возращает, только тот z-index, который прописан в теге, а если они прописан в css, то мы ег оне получим

danik.js 09.12.2013 14:13

Ок.
obj.zIndex
vs
getComputedStyle(obj).zIndex

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

hellbeast92 10.12.2013 13:19

В чем то согласен, но в данном случае я стараюсь изучить синтаксис и возможности прототипирования, методах и тп.

в итоге у меня получился след код
var Slide = function(derection){
    this.dom = sliderMain.querySelectorAll('.slide_' + derection);
};
Slide.prototype.num = function(number){
     var obj = this.dom[number-1];
     obj.zIndex = window.getComputedStyle ? getComputedStyle(obj, '').zIndex : obj.currentStyle.zIndex;
     return obj;
};


Ладно, возник следующий вопрос
как мне воплотить вот такой код:
slideL.num(i).zIndex = 21;

то, есть у меня не работает присваивание.

cyber 10.12.2013 13:36

hellbeast92, тут все зависит от браузеров которые должны использоваться, нужно либо использовать метод, либо использовать дескрипторы http://learn.javascript.ru/descripto...рипторы
Цитата:

поддерживаются всеми современными браузерами, исключая IE<9, Opera<12, Safari<5.1.4.


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