2011-12-01 2 views
3

Je souhaite étendre Object.prototype, pour prendre en charge les notifications dans les données JSON et les éléments html via l'infrastructure d'interface utilisateur.Quels sont les pièges de l'extension Object.prototype?

Object.prototype.setValue = function(key,value){ 
    // this simply sets value as this[key] = value 
    // and raises an event 
    Binder.setValue(this,key,value); 
}; 
Object.prototype.getValue = function(key){ 
    return Binder.getValue(this,key); 
}; 

Cependant, sur cette question, Extending Object.prototype JavaScript et quelques autres, les gens disent que nous devrions éviter d'étendre Object.prototype, au lieu de tout autre type est très bien.

Si je ne le fais pas, alors mon code devient plus grand, par exemple

window.myModel.setValue("currentStatus","empty"); 

devra être écrit comme,

Binder.setValue(window.myModel,"currentStatus","empty"); 

Je veux savoir ce qui va mal tourner si je utiliser ces méthodes? cela va-t-il amener JQuery à se comporter de façon inattendue? J'ai vu une fois, que la requête ajax de jQuery invoque aussi des méthodes prototypes (car elles font référence à des fonctions pour la gestion d'événements).

Quels sont les autres effets secondaires de ce produit? Je sais que cela échoue pour (var x dans obj), mais la plupart du temps, nous pouvons utiliser obj.hasOwnProperty, cela devrait aider à droite?

Répondre

1

Tu ne veux pas salir avec des prototypes d'hôte ou des objets natifs.

  • Vous ne pouvez pas savoir quels sont les effets secondaires qu'elle a sur tout script tiers
  • Vous pouvez confondre code tiers
  • Vous ne savez pas si un jour ces méthodes sont créées nativement

global, extension Object.prototype effets aucun autre objet sur l'ensemble du site. Encore une fois, vous ne voulez pas le faire, à moins que vous ne soyez dans un environnement de type sandbox et que chaque élément d'ecmascript soit écrit par vous-même et que vous soyez sûr à 100% qu'aucun script tiers n'est chargé.

2

Je sais qu'il échoue for(var x in obj), mais la plupart du temps nous pouvons utiliser obj.hasOwnProperty, cela devrait aider non?

C'est le seul piège majeur, et .hasOwnProperty() aide, mais seulement dans votre propre code. Dans jQuery, par exemple, ils ont pris la décision délibérée et non d'appeler .hasOwnProperty dans la méthode $.each().

Je l'ai utilisé Object.defineProperty(...) dans mon propre code pour contourner le problème de la propriété dénombrable sans effets néfastes (quoique sur Array.prototype)

+0

Pourquoi l'auteur de jQuery a-t-il pris la décision de ne pas appeler .hasOwnProperty, quelle qu'en soit la raison? Il essaie d'appeler mes gestionnaires d'événements et notifie des changements, mais j'ai trouvé une solution de contournement en vérifiant les arguments. –

Questions connexes