2010-09-28 6 views
1

C'est en quelque sorte ce que les fermetures sont censées éviter, mais je me demande s'il existe un moyen d'ajouter une méthode à une fermeture. Fondamentalement, j'ai une bibliothèque de fichiers js que je voudrais augmenter pour un client spécifique en ajoutant une nouvelle méthode.Puis-je ajouter une méthode à une fermeture?

Je dispose d'un fichier js appelé bibliothèque:

var LIBRARY = (function(){ 
var name; 
return { 
setName: function(n) { name = n; } 
}()); 

mais pour un nouveau client Je veux leur donner un nouveau fichier js qui vient compléter la bibliothèque, l'ajout d'une nouvelle fonction:

function(first, last){ 
name = first + " " + last; 
} 

Je ne veux pas avoir à modifier la bibliothèque js cependant. Est-il possible d'ajouter cette fonction à LIBRARY afin que la fonction ait l'accès nécessaire à la variable name?

Répondre

0

Je voulais juste laisser une note sur la façon dont je fait accompli parce qu'il met en évidence une autre façon de penser à l'architecture en JS.

Comme je l'ai mentionné, je voulais être en mesure d'augmenter ma bibliothèque avec des fonctions spécifiques au client. Ce que je fini par faire était de modifier ma bibliothèque pour lire quelque chose comme:

var LIBRARY = (function(){ 
var name; 
var settings; 
return { 
    init: function(options){ 
    jQuery.extend(settings, options); // just merges two objects together 
    } 
    setName: function(n) { name = n; } 
    custom: function(){ 
    if (!settings.custom || typeof(settings.custom == 'function')) 
     return; 
    name = settings.custom.apply(this, arguments); 
    } 
}()); 

Ensuite, la bibliothèque client augmente ma bibliothèque avec une fonction comme ceci:

LIBRARY.init({ custom: function(first, last) { 
return first + " " + last; 
} }); 

maintenant le code client peut appeler:

LIBRARY.custom("static", "hippo"); 

et nom sera réglé sur "Hippo statique"

1

Non, malheureusement, vous ne pouvez pas   — ou du moins, pas de manière raisonnable. Seules les fonctions définies dans cette fermeture auront accès à cette variable locale.

La façon déraisonnable de le faire serait de jouer à des jeux avec eval, mais je vous déconseille vivement.

Tout ce que vous pouvez faire est d'ajouter des fonctions à LIBRARY qui n'ont pas besoin d'un accès direct à cette variable.

0

Je ne sais pas exactement comment vous envisagiez la « appending », mais cela fonctionne

// Base 
var LIBRARY = (function(){ 
    var name; 
    return { 
     setName: function(n) { name = n; } 
    , getName: function() { return name; } 
    } 
}()); 

// Extension 
LIBRARY.setFullName = function(first, last) 
{ 
    this.setName(first + " " + last); 
} 

// Test 
LIBRARY.setFullName('Peter', 'Bailey'); 
alert(LIBRARY.getName()); 
+0

j'étais hopin g pour pouvoir aller directement sans exposer la variable name (bien que le setName n'expose qu'un setter, ce n'est pas une idée). Il se peut que vous ayez à suivre cette route – hackerhasid

+0

@statichippo: C'est vraiment votre seule option interdisant (encore) d'utiliser 'eval', qui est juste une boîte de Pandore. –

+0

Je ne considère même pas le chemin eval. eval est juste une lettre loin du mal;) – hackerhasid

Questions connexes