2013-04-15 2 views
0

Я пишу свои собственные элементы, которые имеют еще несколько методов, чем стандартный DOM элемент, вот один, который наследует от объекта ElementAppendChild не работает!, Наследующий от объекта DOM Element..Что я делаю неправильно здесь?

function MyObject(){ 

    return (Object.create(document.createElement("Mytag"),{ 
     myfunction:function(){ 
      return blahblah; 
     } 
    })); 

}//function for creating object ends 

function MyObject2(){ 

    return (Object.create(document.createElement("Mytag2"),{ 
     myfunction:function(){ 
      return blahblah; 
     } 
    })); 

}//function for creating second object ends 

var a=new MyObject();//statement works fine 
var b=new MyObject2();//statement works fine 

Теперь, когда я пытаюсь сделать один из этих объектов Дитя другой я получить любую вещь, чтобы работать, а исключение бросают

a.appendChild(b); 
+0

какое исключение выбрано? – Alnitak

+1

и FWIW, я не думаю, что это подходящее использование 'Object.create'. добавление на объект должно содержать _property дескрипторы_, а не методы. См. https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create – Alnitak

+1

Почему вы хотите, чтобы объект наследовал от Элемент DOM? – 2013-04-15 19:27:26

ответ

0

поскольку вы используете return (Object.create(...));, ваши new MyObject(); и new MyObject2(); объекты возврата, а не элементы DOM, поэтому a.appendChild(b) не будет работать, так как a и b, как ожидается, будут элементами DOM.

Чтобы увидеть разницу, посмотрите на консоли в этом jsFiddle

+0

для var a = new MyObject(); typeof a; // возвращает объект и для var c = document.createElement ("Mytag3"); typeof c; // все еще возвращает объект Так в чем разница? – user2283857

+0

Несомненно, они оба являются 'объектами', но существует много типов объектов. Осмотрите вывод консоли моего обновленного jsFiddle, чтобы увидеть разницу: http://jsfiddle.net/RWaKT/2/, т. Е. Один из них является стандартным «объектом Object» (поскольку он был создан с помощью Object.create), другой - «объект HTMLUnknownElement» (потому что это элемент DOM). Последний имеет метод 'appendChild', первый - нет. – Steve

+0

Но наследование есть? Или нет? Когда appendChild (e) ожидает, что e будет узлом, и его примет e, если он является Element (поскольку элемент наследуется от Node), почему он не принимает объект, который наследует Element (так как он также наследует Node, поскольку элемент наследует Узел)? – user2283857

0

Вам необходимо пройти дескрипторы свойств к Object.create, а не методы.

function MyObject() { 
    return Object.create(document.createElement("Mytag"), { 
     myfunction: { 
      value: function() { 
       return 'blahblah'; 
      } 
     } 
    }); 
} 

Это делает работу для меня в Chrome:

a = new MyObject(); 
> HTMLUnknownElement {spellcheck: true, isContentEditable: false, contentEditable: 
    "inherit", children: HTMLCollection[0], outerText: ""…} 
a.myfunction() 
> "blahblah" 

Однако обратите внимание, что имеет не правильно установить «тип» объекта MyObject. Это также предотвращает исключение исключения из-за того, что я пытаюсь добавить объект в DOM :(

+0

Я передал дескрипторы свойств, прежде чем делать шаг, чтобы написать его непосредственно как метод (это было просто из-за непонимания места, где была ошибка) ... но запись его напрямую, поскольку атрибут работал нормально, я думал, что мы могли бы написать оба их ... спасибо за исправление – user2283857

 Смежные вопросы

  • Нет связанных вопросов^_^