2013-04-15 1 views
0

Je vous écris mes éléments personnalisés qui ont des méthodes plus que l'élément standard DOM, ici est celui qui hérite de l'objet ElementAppendChild ne fonctionne pas!, Héritant de l'objet DOM Element..Qu'est-ce que je fais mal ici?

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 

Maintenant, quand j'essaie de faire un de ces objets l'enfant du autre chose que je reçois un à travailler, plutôt une exception est levée

a.appendChild(b); 
+0

quelle exception est levée? – Alnitak

+1

et FWIW, je ne pense pas que ce soit une utilisation appropriée de 'Object.create'. add on object est supposé contenir _property descriptors_, pas des méthodes Voir https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create – Alnitak

+1

Pourquoi voulez-vous qu'un objet hérite d'un objet? Élément DOM? –

Répondre

0

Parce que vous utilisez return (Object.create(...));, vos éléments new MyObject(); et new MyObject2(); objets de retour et non DOM, donc a.appendChild(b) ne fonctionnera pas, comme a et b devraient être des éléments DOM.

Pour voir la différence, jetez un oeil à la console dans ce jsFiddle

+0

pour var a = new MonObjet(); Typeof a; // renvoie un objet et var c = document.createElement ("Mytag3"); typeof c; // retourne toujours l'objet Alors, quelle est la différence? – user2283857

+0

Bien sûr, ils sont tous les deux 'objets ', mais il existe plusieurs types d'objets. Inspectez la sortie de ma jsFiddle mise à jour pour voir la différence: http://jsfiddle.net/RWaKT/2/ ie, on est un 'object Object 'standard (parce qu'il a été créé avec' Object.create'), le l'autre est un 'object HTMLUnknownElement' (parce que c'est un élément DOM). Ce dernier a la méthode 'appendChild', le premier ne le fait pas. – Steve

+0

Mais l'héritage existe-t-il ou n'est-ce pas? Quand appendChild (e) s'attend à ce que e soit un noeud et accepte e s'il est un élément (parce que l'élément hérite de Node), pourquoi n'accepte-t-il pas un objet héritant d'Element (puisqu'il hérite également de Node car Element hérite Nœud)? – user2283857

0

Vous devez passer descripteurs de propriété-Object.create, pas des méthodes.

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

Cela fonctionne pour moi dans Chrome:

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

Notez cependant que l'on n'a pas correctement réglé le "type" de l'objet à MyObject. Cela n'empêche pas non plus qu'une exception soit levée lorsque j'essaie d'ajouter l'objet au DOM :(

+0

J'ai passé les descripteurs de propriété avant de faire un pas pour l'écrire directement comme une méthode (juste parce que l'erreur était mal comprise) ... mais l'écrire directement comme un attribut fonctionnait bien, je pensais que nous pouvions écrire les deux eux ... merci pour la correction – user2283857

Questions connexes