11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

Le titre de mon sujet n'est pas très clair mais je n'ai pas trouvé autre formulation.
Alors voilà, je suis contrains de prototype le type Array de moultes fonctions.

Exemple:


Array.prototype.maFonction1 = function(){
  blabla...
}
Array.prototype.maFonction2 = function(){
  blabla...
}
Array.prototype.maFonction3 = function(){
  blabla...
}
...


Ce que j'aimerais savoir, c'est s'il y a un moyen d'éviter l'ecriture de 'Array.prototype' en utilisant une sorte d'objet global.

Exemple :


Array.prototype = {
   maFonction1: function(){
      blabla...
   },
   maFonction2: function(){
      blabla...
   },
   maFonction3: function(){
      blabla...
   }
}



Merci d'avance
tu cherche a faire un objet en javascript ?

car si c'est le cas tu a juste a faire :

var nameObj=
{
mamethode:function(myParam) { /* ton code */ },
mamethode:function(myparam,myparm2 ) { /** ton code */ }

}

et utiliser ensuite ainsi :

nameObj.mamethode('quelquechose.... ');


j'ai peut être mal compris ta question ??
ou tu parle peut être de prototype ( la lib ) ??
ou tu cherche seulement a te debarasser de la syntaxe : Array.prototype ??
Modifié par dotmessy (30 May 2008 - 11:07)
Salut et merci pour ta réponse.

Ce que je recherche à faire, c'est d'eviter la saisie de 'Array.prototype' pour chaque fonction. J'aimerai trouver le moyen de prototyper l'objet 'Array' en une passe (en lui envoyant directement une collection de fonctions).
je vais peut être te dire une bêtise, mais test on sait jamais :

essaye de faire un obj générique en javascript qui fait ce que tu a besoin et apres assigne le directement a ton Array.prototype=new Monobj;

A vrai dire j'ai jamais redéfinit de prototype d'objet existant ...

désoler de ne pas pouvoir t'aider plus
Helas, ca ne fonctionne pas. Mais je vai essayer de trouver. Merci quand même.


var extension = {
	fonction1: function(){
		alert('ok fonction 1');
	},
	fonction2: function(){
		alert('ok fonction 2');
	}
}
Array.prototype = new extension;

var arrayTest = ['toto', 'tutu', 'titi'];

arrayTest.fonction1();
Tu peux peut-être essayer avec le mot-clé with. C'est une façon relativement méconnue qui permet de simplifier parfois l'écriture.

Exemple :

with (Array.prototype) {
.function1 = function () { ... };
.function2 = function () { ... };
.function3 = function () { ... };
}


Je n'ai pas testé, je ne sais pas si ça marche dans ce cas.
Modifié par QuentinC (30 May 2008 - 22:56)
QuentinC a écrit :
Tu peux peut-être essayer avec le mot-clé with. C'est une façon relativement méconnue qui permet de simplifier parfois l'écriture.

Mais qui devrait rester méconnue. ^^
La solution la plus sexy est celle de mootools :

Array.prototype.extend(function(obj) {
    for (var i in obj) {
       if (!this.prototype[i ])
           this.prototype[i ] = obj[i ]
    }
})

Array.extend({
   func1:function() {},
   func2:function() {}
}

Modifié par Gatsu35 (31 May 2008 - 09:16)
bonjour à tous

a écrit :

Ce que j'aimerais savoir, c'est s'il y a un moyen d'éviter l'ecriture de 'Array.prototype' en utilisant une sorte d'objet global.


l'objet global en javascript existe , et est créer à chaque que l'on crée un nouvel objet avec 'new' (voir Object.prototype)


Gatsu35 a écrit :

La solution la plus sexy est celle de mootools


... mais extend est une méthode de mootools , il faut donc inclure la lib !
Et pourquoi veux-tu 'factoriser' absolument Array.prototype !?
Est-ce que le code sera plus lisible ou portable ...!?

Sinon Dean Edwards (ben oui encore lui) a créé une 'simple' classe de base
qui comme il le précise : I want to achieve the above without affecting Object.prototype (suivez le lien sur la page de Dean pour une intéressante discussion)

++
a écrit :

La solution la plus sexy est celle de mootools

Assez original cette fonction extend, en effet. Intéressant.
....

j'ai pas fait exprès mais :
a écrit :

MooTools Credits
Class is slightly based on Base.js

cf : $extend
Smiley ravi
Modifié par kzone (31 May 2008 - 10:43)
Salut et merci pour vos réponses.

En effet, j'ai déjà jetté un coup d'oeuil sur les libs Mootools et Proto qui utilisent tous deux une fonction "extend()".
Après avoir utilisé ce système, j'arrive sans problème à étendre des objets comme 'document' ou 'window'. Mais le problème est sur les types d'objet (array, string, etc...). J'ai du louper une ligne quelque part...
Modérateur
Hello,

Pourquoi ne pas prendre le problème à l'envers en créant ses propres objets et en les étendant avec les méthodes d'Array, String, etc... ?

L'avantage serait de laisser les objets internes au langage tel quel, ce qui prévient d'éventuels conflits, tout en disposant de nouvelles méthodes.
koala64 a écrit :
Hello,

Pourquoi ne pas prendre le problème à l'envers en créant ses propres objets et en les étendant avec les méthodes d'Array, String, etc... ?

L'avantage serait de laisser les objets internes au langage tel quel, ce qui prévient d'éventuels conflits, tout en disposant de nouvelles méthodes.

oué mais nan, cela pourrait etre lourd derriere, surtout que Array, String il est plutot utile de les etendre par defaut avec des methodes generiques qui manquent dans le langage.

Il suffit de prendre le cas de Array avec les methodes :
Each, filter, map, getLast, rien qu'avec ça c'est le bonheur derriere.
Et idem avec String pour trim par exemple
Modérateur
Pour faire mon objet, je peux prendre uniquement les méthodes qui m'intéressent et non l'ensemble. Aussi, la lourdeur dépend pas mal de ce qu'on y met. En revanche, si j'implémente une méthode each pour Array avec 3 paramètres (par exemple), on prend le risque que cela fonctionne jusqu'à ce que le langage implémente à son tour each... car le jour où ça arrive : pas de bol, c'était 2 paramètres et non 3 qu'il fallait mettre.

Si j'avais procédé avec un objet ayant ma méthode each plus les méthodes qui m'intéressent d'Array, le script fonctionnera toujours le jour où cette méthode sera implémentée dans Array.
Modifié par koala64 (31 May 2008 - 21:04)
koala64 a écrit :
Pour faire mon objet, je peux prendre uniquement les méthodes qui m'intéressent et non l'ensemble. Aussi, la lourdeur dépend pas mal de ce qu'on y met. En revanche, si j'implémente une méthode each pour Array avec 3 paramètres (par exemple), on prend le risque que cela fonctionne jusqu'à ce que le langage implémente à son tour each... car le jour où ça arrive : pas de bol, c'était 2 paramètres et non 3 qu'il fallait mettre.

Si j'avais procédé avec un objet ayant ma méthode each plus les méthodes qui m'intéressent d'Array, le script fonctionnera toujours le jour où cette méthode sera implémentée dans Array.

petite precision pour each : c'est juste le raccourci de forEach.
et comme en général les choses sont faites dans le bon sens ça passe bien.
Mais je reste d'accord dans l'ensemble. Mais pour les objets généraux il est plus utile d'avoir recours aux methodes fournies par l'objet lui meme


function fois2() {}
function plus5() {}
function filtre5() {}
var nums = [1,2,3,4,5,6,7]
var filtre5fois2plus5array = nums.map(fois2).map(plus5).filter(filtre5);

Ici utiliser les methodes de array a son important
En fait, la solution à mon problème était plutôt simple...


function extendNativeType(oNativeType, oExtendedType){
	for (var property in oExtendedType){
		if (!oNativeType.prototype[property]) oNativeType.prototype[property] = oExtendedType[property];
	}
}

var extendedArray = {
	test: function(){
		alert(this.length);
	}
}

extendNativeType(Array, extendedArray);

var arrayTest = ['titi', 'toto', 'tutu'];

tt.test();