Question

J'utilise jQuery avec le plugin validators. Je voudrais remplacer le & Quot; requis & Quot; validateur avec l'un des miens. C’est facile:

jQuery.validator.addMethod("required", function(value, element, param) {
    return myRequired(value, element, param);
}, jQuery.validator.messages.required);

Jusqu'ici, tout va bien. Cela fonctionne très bien. Mais ce que je veux vraiment faire, c’est d’appeler ma fonction dans certains cas et le validateur par défaut pour le reste. Malheureusement, cela s'avère être récursif:

jQuery.validator.addMethod("required", function(value, element, param) {
    // handle comboboxes with empty guids
    if (someTest(element)) {
        return myRequired(value, element, param);
    }
    return jQuery.validator.methods.required(value, element, param);
}, jQuery.validator.messages.required);

J'ai consulté le code source des validateurs et l'implémentation par défaut de " required " est défini en tant que méthode anonyme à l'adresse jQuery.validator.messages.required. Donc, il n'y a pas d'autre référence (non anonyme) à la fonction que je peux utiliser.

Stocker une référence à la fonction en externe avant d'appeler addMethod et appeler le validateur par défaut via cette référence ne fait aucune différence.

Ce que je dois vraiment faire est de pouvoir copier la fonction de validation requise par défaut par valeur plutôt que par référence. Mais après de nombreuses recherches, je ne vois pas comment faire cela. Est-ce possible?

Si c'est impossible, je peux alors copier la source pour la fonction d'origine. Mais cela crée un problème de maintenance, et je préférerais ne pas le faire sauf s’il n’existe pas de & "Meilleure façon de faire. &";

Était-ce utile?

La solution

  

Stocker une référence à la fonction   en externe avant d'appeler addMethod   et en appelant le validateur par défaut via   cette référence ne fait aucune différence.

C’est exactement ce que devrait fonctionner .

jQuery.validator.methods.oldRequired = jQuery.validator.methods.required;

jQuery.validator.addMethod("required", function(value, element, param) {
    // handle comboboxes with empty guids
    if (someTest(element)) {
        return myRequired(value, element, param);
    }
    return jQuery.validator.methods.oldRequired(value, element, param);
}, jQuery.validator.messages.required);

Cela devrait également fonctionner: (et le problème avec this est résolu)

var oldRequired = jQuery.validator.methods.required;
jQuery.validator.addMethod("required", function(value, element, param) {
    // handle comboboxes with empty guids
    if (someTest(element)) {
        return myRequired(value, element, param);
    }
    return oldRequired.call(this, value, element, param);
    // return jQuery.oldRequired.apply(this, arguments);
}, jQuery.validator.messages.required);

Autres conseils

Function.prototype.clone = function() {
    var fct = this;
    var clone = function() {
        return fct.apply(this, arguments);
    };
    clone.prototype = fct.prototype;
    for (property in fct) {
        if (fct.hasOwnProperty(property) && property !== 'prototype') {
            clone[property] = fct[property];
        }
    }
    return clone;
};

Le seul inconvénient, c'est que le prototype n'est pas cloné, vous ne pouvez donc pas le changer ... Je travaille sur un moyen de cloner n'importe quel type d'objets et il ne me reste plus qu'à RegExp. Je vais donc probablement éditer demain et mettre tout le code (ce qui est assez long et n'est pas optimisé si vous ne l'utilisez que pour des fonctions et des objets.

Et pour commenter d’autres réponses, utiliser eval () est totalement stupide et beaucoup trop long, et le constructeur Function est un peu la même chose. Les literrals sont bien meilleurs. Et inclure JQuery rien que pour cela, de plus, si cela ne fonctionne pas correctement (et je ne pense pas que ce soit le cas), ce n’est pas la meilleure chose à faire.

Voici une réponse mise à jour

var newFunc = oldFunc.bind({}); //clones the function with '{}' acting as it's new 'this' parameter

Cependant .bind est une nouvelle fonctionnalité de JavaScript mais il existe une solution de contournement de Mdn

https://developer.mozilla.org/en/JavaScript/ Référence / Global_Objects / Fonction / bind

De plus, il ne clone pas les propriétés supplémentaires de la fonction.

Remarque: Comme l'a souligné @gsnedder: la déclaration liée, & "this &"; argument u fourni (espace vide {} ci-dessus). Restera pour tous les futurs appels de la fonction, indépendamment de la substitution via les fonctions apply () / call ().

Cela peut être utilisé à votre avantage ou à votre désavantage, selon la façon dont vous le gérez.

Je pense que vous manquez juste un peu de portée. Essayez ceci:

jQuery.validator.methods._required = jQuery.validator.methods.required;
jQuery.validator.addMethod("required", function(value, element, param) {
    // handle comboboxes with empty guids
    if (someTest(element)) {
        return myRequired(value, element, param);
    }
    return jQuery.validator.methods._required.call(this, value, element, param);
}, jQuery.validator.messages.required);

(Cela ne devrait être qu'un commentaire pour Peut Je copie / clone une fonction en JavaScript? ... malheureusement avec le représentant & Lt; 50 ne peut que poster)

Function.prototype.clone=function(){
    return eval( '('+this.toString()+')' );
}

suffit, ou même

Object.prototype.clone=function(){
    return eval( '('+this.toString()+')' );
}

réflexions sur l'efficacité:

  • l'efficacité humaine est bien plus importante que le gaspillage humain ressources pour optimiser ou améliorer la & vie; & ";
  • d'une machine
  • les ordinateurs et les systèmes automatisés sont supposés réduire l'effort humain ne pas l'augmenter
  • les frais généraux de calcul doivent avoir un impact important sur l'appétibilité du résultat pour la consommation humaine, par beaucoup de gens, pour justifier l'investissement effort d’optimisation du code qui devient souvent plus obscur, obscur et si ésotérique qu’il ne peut plus être compris par une écurie de les programmeurs après des heures d’essai de " comprendre " la logique

sur le clonage: cette question peut être assez rhétorique

  • que signifie "&"; cloner & "; un objet javascript? en particulier dans le contexte de la théorie de la fonction récursive
    • un thème commun pour rationaliser le clonage est qu’il isole et & "protège &"; un initiateur à partir de ses doppelg & # 228; changements de doigt
    • si a = new Object(); b = new Object(); sont a et b des clones? que diriez-vous o = Object; a = new o(); b = new o();
  • est-ce vraiment nécessaire?
  • où s'arrête le clonage? sont les attributs prototypiques pour être isolé aussi si le changement d'un objet cloné de ces n'affecte pas instances non associées à l'objet cloné? dans quel cas le clonage doit remonter tout au long de la chaîne prototypique jusqu'à la constructeurs primitifs qui eux-mêmes auraient besoin d'être en quelque sorte cloné et isolé (une astuce dans un navigateur consiste à ouvrir une nouvelle fenêtre et à la repeupler avec l'avertissement que opener . etc. peut encore produire des effets croisés)

si vous voulez cloner une fonction, essayez ceci:

Function.prototype.clone=function(){
    return eval('['+this.toString()+']')[0];
}

On dirait qu’il n’ya pas de "meilleure façon". Je suppose que vous pourriez essayer de créer une fonction personnalisée requise pour votre propre exemple, par exemple:

jQuery.validator.addMethod("customRequired", function(value, element, param) {
  return myRequired(value, element, param);
}, jQuery.validator.messages.required);

On dirait que vous avez déjà tout essayé. Toutes mes excuses si j'ai mal compris la question.

En répondant au message précédent, lorsque je souhaite partager une fonction constructeur tout en conservant un prototype distinct, j'utilise un wrapper dans une nouvelle fonction:

`

init_from_arg_obj = function () {
    return new Function('init', 'for (var i in init) this[i] = init[i];');
};

constructor_A = init_from_arg_obj();
constructor_A.prototype = {a: 'A'};

constructor_B = init_from_arg_obj();
constructor_B.prototype = {b: 'B'};

`

J'ai exécuté plusieurs tests pour vérifier que cela ne ralentissait pas l'exécution sur de bons moteurs JS.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top