Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Наследование новых методов (https://javascript.ru/forum/misc/37193-nasledovanie-novykh-metodov.html)

Skvor 10.04.2013 22:06

Наследование новых методов
 
Хочу сделать метод подсчёта потомков первого уровня по тегу
window.document.getChildElementsByTagName = function (tagName) {
  var A=[];
  for (var i=0; i<this.childNodes.length; ++i) if (this.childNodes[i].tagName==tagName) { A.push(this.childNodes[i]); }
  return A;
};

window.alert(window.document.getChildElementsByTagName("HTML").length);

- работает.

Но если вызывать
window.document.body.getChildElementsByTagName("DIV").length

то не работает.

Возможно ли в JS наследование методов? Связано ли это с инстанцированием?

nerv_ 10.04.2013 22:45

Цитата:

Сообщение от Skvor
Хочу сделать метод подсчёта потомков первого уровня

обязательно его в дум пихать? Вынесите в функцию и будет вам счастье. Или воспользуйтесь уже существующим - qsa.

nikita.mmf 11.04.2013 15:10

function getChildElementsByTagName ( element, tagName ) {
	var children = [];
	tagName = tagName && tagName.toLowerCase();
	for ( var child = element.firstChild; child; child = child.nextSibling ) {
		if ( child.nodeType === 1 && (!tagName || child.nodeName.toLowerCase() === tagName) ) {
			children.push( child );
		}
	}
	return children;
}
alert(getChildElementsByTagName( document, 'html' ).length)
alert(getChildElementsByTagName( document.body, 'div' ).length)

Skvor 11.04.2013 19:21

nikita.mmf, спасибо, практически так и сделал
function getChildElementsByTagName(pt,tagName) {
  var A=[];
  for (var i=0; i<pt.childNodes.length; ++i) if (pt.childNodes[i].tagName==tagName) { A.push(pt[i]); }
  return A;
}

только чуть меньше занудства с проверками ;)

Вопрос - можно ли динамически приляпать объекту метод так, чтоб он стал доступен потомкам, которые инстанцированы раньше?

dastingo 11.04.2013 19:41

можно
"use strict";
   function Parent() {}

   // наследуем
   var child = Object.create( Parent.prototype );

   // приляпываем
   Parent.prototype.method = function() {
      return "works fine" ;
   };
   
   // ок
   alert( child.method() );

nerv_ 11.04.2013 21:39

Цитата:

Не стоит флудить на форуме для изучающих программирование.
Skvor, где в моем посте флуд? Очки купи.

danik.js 11.04.2013 21:54

Цитата:

Сообщение от nerv_
Или воспользуйтесь уже существующим - qsa.

Как через querySelectorAll получить детей?

BallsShaped 11.04.2013 22:37

Вообще, можно сделать так:
Node.prototype.getChildElementsByTagName = function (tagName) {
  var A=[];
  for (var i=0; i<this.childNodes.length; ++i) if (this.childNodes[i].tagName==tagName) { A.push(this.childNodes[i]); }
  return A;
};
Но это, конечно, не кроссбраузерно.

nerv_ 11.04.2013 22:54

Цитата:

Сообщение от danik.js
Как через querySelectorAll получить детей?

var elems = document.querySelectorAll('#test > *');

Skvor 11.04.2013 23:01

BallsShaped, спасибо работает.
Я пытался поставить на window, window.document, window.documentElement и window.body, но в консоли было сообщение, что prototype для них не определён.


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