7
votes

Fonction pour modifier l'objet dans les arguments, pas seulement une propriété

Je suis sûr que cela doit exister quelque part, mais je n'ai pas été capable de le trouver ... em>

J'essaie d'écrire une fonction qui prend un objet comme argument et met à jour sa référence. Pas une propriété de la référence et ne pas réaffecter l'objet, mais mettez à jour toute la référence. p>

Notez que PUBSUB est là simplement pour démontrer le besoin d'asynchronicité et de flexibilité dans les types d'objets passés et mis à jour. p>

mieux expliqué par exemple: P>

//ideally how function would work
function watch(event, obj) {
    PubSub.on(event, function(model) {
        // I want to update the entire object
        // I understand that currently, this is just reassigning
        // I know I can do obj.prop = model, but that's not what I want to do
        obj = model;
    }
};

//example usage
var myObj = {"name" : "Tom"};
watch("anEvent", myObj);
console.log(myObj.name); //still "Tom"

// time passes, then somewhere
PubSub.trigger("anEvent", {"name" : "John"})

console.log(myObj.name); // now should read "John"


2 commentaires

Les questions doivent inclure "Tags" dans leurs titres? Non.


Voir ma réponse à cette question connexe pour une explication détaillée de la manière dont les arguments sont transmis dans JS: Stackoverflow.com/questions/13506398/...


4 Réponses :


8
votes

Ce n'est pas possible.

Qu'est-ce qui vous confond est que, dans JS Runtime, vous n'avez pas de moyen de gérer les valeurs de référence réelles, mais ne peut attribuer qu'une valeur de référence à une variable. p>

C'est tout - vous pouvez "attacher" une autre référence à un nom de variable donné, mais vous ne pouvez pas modifier la valeur de référence. P>

Pour effacer ce que j'ai dit ci-dessus: la mémoire de l'objet est allouée sur son initialisation p >

var o = {};


8 commentaires

Merci pour la bowvote. Je suis sûr que Downvoter peut démontrer que je me trompe. Peut tu? :-)


Ce n'est pas celui qui a bownvote, mais je suppose que c'est parce que vous n'avez pas expliqué pourquoi.


C'est bien de voir les conduites de conduite sont toujours en vogue. :-)


Je ne suis pas suivi. Une variable de référence a une valeur. Quoi de plus y a-t-il? Qu'est-ce que cela signifie "gérer" la valeur de référence?


@Brandon: "Une variable de référence a une valeur" --- une variable a une valeur. Il n'y a pas de "une variable de référence". Parfois, la valeur est une référence à un objet. Vous pouvez modifier la valeur d'une variable. Mais vous ne pouvez pas remplacer un objet, qui est une valeur de référence.


Ok merci - utilisez une fonction du formulaire Watch de fonction (événement, objet, champ) {pubsub.on (événement, fonction (données) {objet [champ] = données})} et je suppose Je vais coller à ça


Exactement. C'est pourquoi je ne comprends pas ce que cela signifie "gérer" une "valeur de référence réelle". Une référence est une variable avec une valeur, comme n'importe quelle variable.


@Brandon: Une référence est une valeur particulière d'une variable, pas une variable elle-même. Traitez-le comme type de données spécial (ce qui n'est pas réellement, mais pour des raisons de simplicité, nous pouvons le penser), qui est résolu à un objet pour vous par le moteur automatiquement. Suite à l'analogie C ++ - Nous transmettons une adresse (une référence) aux données prises par et et js moteur latérérance avec * pour nous implicitement.



1
votes

Les références ne sont que des variables, telles que des primitives. Réaffecter est changer sa valeur.

Vous dites

et ne pas réaffecter l'objet, mais mettez à jour la référence entière.

problème est que ceux-ci signifient la même chose. Si vous voulez dire mettre à jour une autre référence qui pointe sur cet objet à pointer vers quelque chose d'autre, cela ne peut être fait que si l'autre référence est dans votre portée.

Il n'y a aucun moyen de dire, donné une référence à un Objet particulier, modifier toutes les références à cet objet pour pointer sur un autre objet. On dirait que c'est ce que vous essayez de faire. Désolé, pas possible. Vous auriez besoin d'un objet intermédiaire avec une propriété qui est la référence que vous souhaitez modifier. xxx


2 commentaires

En ce qui concerne: si l'autre référence est dans votre portée , je ne dirais pas du tout depuis de faire ce que veut le choix, vous auriez besoin de connaître toutes les autres variables qui référent l'objet. Et puisqu'il n'y a aucun moyen de connaître toutes les variables de votre portée actuelle (vous ne pouvez pas vous inciter à un objet de contexte de la variable ou d'exécution), vous ne pouvez certainement pas le faire dans d'autres cordes.


Correct. C'est ce que j'essayais de dire, c'est que vous devriez avoir accès à toutes les références de votre portée et d'espérer qu'ils n'ont pas été modifiés. Pas très réaliste.



0
votes

Il n'y a aucun moyen de savoir, ni de trouver, toutes les références à un objet, il n'ya donc aucun moyen général de réaffecter toutes les références à un autre objet. Vous pouvez le faire statiquement avec des fermetures et obtenir et définir les méthodes (voir Douglas Crockford's membres privés à JavaScript ), mais cela ne semble pas être ce que vous voulez.

Aussi, Bind est spécifique à la variable cette de la fonction, qui est un paramètre d'une fonction contexte d'exécution . Ce n'est pas lié à la portée.


0 commentaires

3
votes

Je vais supposer que vous avez lu mon explication à l'adresse suivante: Pourquoi les valeurs des objets sont-elles capturées dans les appels de fonction? .

Si vous comprenez ce qui se passe. Et vous y réfléchissez assez fort. Vous verrez un travail évident autour. P>

Donc, contrairement à la réponse de tous les autres que je vais dire: Oui, c'est possible (dans les limites). P>


Le Travailler sur h2>

premier, un récapitulatif. Vous réalisez que ce que vous avez est en fait deux références distinctes sur le même objet? L'attribution d'une référence ne fera pas la réaffectation de l'autre que l'autre référence: p> xxx pré>

donc, tandis que la barre droite = new_Object code> ne fonctionnera pas. Réalisez que les deux références indiquent le même objet fort> au point qui vous intéresse. P>

ce qui signifie que, même si vous n'avez pas accès à la référence d'origine ('FOO' Dans mon exemple, "MyOBJ" dans votre exemple) Ce que vous avez, c'est l'objet qu'il pointe. Qui est ce que nous pouvons exploiter. P>

à condition que vous ne vous souciez pas de ce qui arrive à l'objet actuel et à condition que cela ne vous dérange pas que toutes les références à l'objet soient modifiées, vous pouvez simplement faire une suppression profonde. de tous les attributs et remplacez-les d'une copie profonde du nouvel objet. P>

Donc, alors que vous ne pouvez pas faire: P>

function watch(event, obj) {
    PubSub.on(event, function(model) {
        reassignObjRef(obj,model);
    }
};


0 commentaires