DIITHiTech
@DIITHiTech
Fullstack javascript developer

Возможно ли унаследоваться, например, от HTMLDivElement стандартным способом и создавать элементы через конструктор?

Про document.registerElement я осведомлен, но наследование там неудобное и спецификация только draft
А влоб унаследоваться от HTMLElement я так подозреваю невозможно сейчас? Выходит, без полного определения своего элемента со своим уникальным тегом создать расширенный элемент на базе существующего не удастся? Т.е , расширенный элемент с тем же тегом, но который можно создать только из js т.е парсер html браузера не должен спаунить его. Что то нечеловеческие api делают эти разработчики спецификации. Хотелось бы наследоваться как от обычного объекта js, а они палки в колеса ставят... грусть-печалька...=(

try {
           var nativeDiv = new HTMLDivElement(); //Uncaught TypeError: Illegal constructor
           console.log(nativeDiv);

           document.body.appendChild(nativeDiv);
       }catch(err){
           console.error(err);
       }

       var inherit= function (context, Parent) {
           if (typeof Parent!=='function')
               throw new TypeError('given supper class is not constructor!');
           var F = function () {};
           F.prototype = Parent.prototype;
           context.prototype = new F();
           context.prototype.constructor = context;
           context.base = Parent.prototype;
           return context;
       }

       function WidgetElement(){}

       inherit(WidgetElement,HTMLDivElement);

       WidgetElement.prototype.burnTheWorld=function(){/*evil code here*/};

       var custom=new WidgetElement();

       document.body.appendChild(custom); //Uncaught TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.
  • Вопрос задан
  • 718 просмотров
Решения вопроса 1
nazarpc
@nazarpc
Open Source enthusiast
и спецификация только draft

Есть полифиллы для достаточно качественной поддержки.

Что то нечеловеческие api делают эти разработчики спецификации. Хотелось бы наследоваться как от обычного объекта js, а они палки в колеса ставят... грусть-печалька...=(

Я присылал исправления в полифиллы, которые поддерживают разработчики из Google, так вот, там столько нюансов возникает при наследовании, что я бы на вашем месте был поосторожнее с такими высказываниями)

В целом - создавайте свой тэг с помощью WebComponents.js, IE10+ работает ОК, использую постоянно уже достаточно давно, по началу были баги, приходилось самому исправлять и отправлять патчи, сейчас всё достаточно стабильно и хорошо кроме случаев когда полифилл в принципе не может обеспечить имитацию функциональности (описано у них в документации, не критично на самом деле).
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
romanzhak
@romanzhak
Mathematician
Это вовсе не нужно делать, хотя бы потому, что не все браузеры дают доступ к прототипам dom-элементов. Подробнее здесь: stackoverflow.com/questions/1489738/how-to-inherit...
Ответ написан
Ваш ответ на вопрос

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

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