Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

# bug sur Object.prototype ?

Envoyé par : aMan

Date : 19/08/2007 03:09

Bonsoir tous le monde (oui il est tard pour encore travailler)...

Il me semble qu'un bug existe dans xulrunner (mais je n'en suis pas certains, voilà donc pourquoi je n'ai pas posté dans bugzilla).

Si j'esssaye de prototypé l'objet Object et qu'en suite j'essaye d'accéder à la méthod depuis un objet tiers (un objet créer par mes soins) la method est inaccessible...

Un bout de code pour mieux expliquer

Object.prototype.clone = function(){
    //blabla
}

function monObjet(){
    this.myvar = null;
}

var monInstance = new monObjet();
var macopie = monInstance.clone()

est là dans la console d'erreur je récupere : "Error monInstance.clone is not a function"

Est ce que chez moi.. Ou chez vous aussi ?

ps : le même code marche très bien dans une page html sous firefox

pps : j'utilise xulrunner 1.9a8pre sous os X mais ca fait pareil avec des versions plus anciennes.

Merci d'avance

# Re: bug sur Object.prototype ?

Envoyé par : hhf

Date : 19/08/2007 13:40

oui curieux. Et avec une autre methode ? Idem ?

sinon, juste une petite correction, qui n'en est pas vraiment une, mais juste pour la beauté du code...

Au lieu de faire ca :

 function MonObjet(){
   this.myvar = null;
 }

Qui est en quelque sorte le constructeur, et donc devrait initialisé les variables d'instances en fonction des arguments passés au constructeur..

 function MonObjet(arg1){
   this.myvar = arg1;
 }

tu devrais donc faire ca à mon sens :

 function MonObjet(){
 }
 MonObjet.prototype = {
   myvar : null
 }

ou

 function MonObjet(){}
 MonObjet.prototype.myvar = null;

Note aussi la majuscule au nom de la classe : MonObjet et non moObjet. Je sais je chipote... :-D

# Re: bug sur Object.prototype ?

Envoyé par : aMan

Date : 19/08/2007 17:57

Oui avec une autre methode c'est pareil.

Cependant si j'essaye de prototypé String par exemple ca marche très bien.

pour exemple :

String.prototype.maMethode = function(){
    alert(this);
}
var maVar = "une chaine de caractère".
maVar.maMethode();
// la methode maMethode est bien appelée est l'alert ce fait correctement.

Merci hhf pour tes conseils de style de "nomenclature". Il est vrai que j'oubli bien souvent mes majuscules au constructeur de mes classes.

Un peu d'explication quand même :

L'intérêt pouvoir prototypé Objet (avec la fameuse méthode clone) est de pouvoir faire du "deep copy" sans vérifier le type de donnée inclus dans l'objet. Le but étant dans mon framework (qui risque de devenir open source... :) ) de prototyper sur chacun des objets natifs de javascript (Object,String,Number,Array,function, etc...) une methode clone qui sera appelée automatiquement sans vérification du type de donnée à cloner via un typeof par exemple.

Donc il ne reste plus qu'a trouver une solution (ou à déclarer un bug si ca en est un) pour le prototypage d'Objetct

# Re: bug sur Object.prototype ?

Envoyé par : hhf

Date : 20/08/2007 00:47

j'avais bien compris le but.

Un truc comme ca quoi...

  Object.prototype.clone = function(deep) {
     var elt = new this.constructor();
     for(var prop in this) {
        if(deep && (typeof this[prop] == "object") && (typeof this[prop][clone] != "undefined")) {
           elt[prop] = this[prop].clone(deep);
        } else if(this[prop]!=elt[prop]) {
           try {
              elt[prop] = this[prop];
           } catch(e) {
             // peut etre une propriete en lecture seule
           }
        }
     }
     return elt;
  }

Fais néamoins attention à la recursivitée.

  var a = new A();
  var b = new B();
  a.b = b;
  b.a = a;
  var c = a.clone(true); // risque de poser probleme.

Ce n'est pas un probleme si trivial que ca...

# Re: bug sur Object.prototype ?

Envoyé par : aMan

Date : 29/08/2007 13:32

de retour...

Merci hhf de ta réponse. Mais je confirme que c'est un peu "buggy" l'héritage des methodes personnalisé de l'objet Object sur un objet perso. J'ai réussi à le faire marcher une method similaire a celle de ton précédent post de cette manière.

Object.prototype.clone = function(deep) {
    //code
}
function MonObjet(){
    //code
}
MonObjet.prototype.clone = Object.clone;

Mais bon au final j'ai abandonné le concept momentanément et je crée tout simplement une fonction clone sur les objets nécessaire qui clone comme je le désire chaque objet.

Merci en tout cas de ton aide. Et à très bientôt.

Il n'est plus possible de poster des messages dans ce forum.


Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.

Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™ sont des marques de la fondation Mozilla.