2010-04-08 14 views
1

Je rencontre des problèmes pour référencer l'objet souhaité lorsque j'ai des fonctions de type espace de noms.référençant les objets souhaités dans les fonctions nommées

Pas de problème:

obj.test = function() { 
    // this == obj 
} 

Mais je suis en train de trébucher quand je namespace:

obj.namespace.test = function() { 
    // this == namespace 
} 

Dans ce dernier exemple, je sais this références namespace, mais je veux faire référence obj . Comment puis-je le faire?

Répondre

1

D'autres ont fait de bonnes suggestions. Je voulais juste ajouter que vous pouvez aussi faire de l'espace de noms une fonction qui retournera un objet avec une variable pointant vers l'obj et les fonctions de membre que vous voulez.

Exemple:

// Note that "namespace" is a reserved word in JS for some reason, 
    // so you can't use it as a variable/function/etc name. 
    var myNamespace = function myNamespace(){ 
     var that = this; 

     var test = function test(){ 
      //in here use this.that to point to obj 
      alert(this.that.name); 
     }; 

     return {that: that, test: test}; 
    }; 

    // Then create the obj: 
    var obj = { name: "Mr. Ahb Jeckt", myNamespace: myNamespace}; 

    // Then you can just call the "namespace" and member function like this: 
    obj.myNamespace().test(); 


    //Or, "initialize" the namespace and call it like so: 
    obj.myNamespace = obj.myNamespace(); 
    obj.myNamespace.test(); 

    obj.name = "Mrs Ahb Jeckt"; 
    obj.myNamespace.test(); 

De cette façon, il n'y a pas de références codées difficiles à OBJ dans le même « espace de noms », et je pense qu'il est assez propre.

Cela fonctionne également si obj est une "classe"; juste faire obj un constructeur au lieu d'un objet littéral:

// Then create the obj: 
var obj = function (name){ 
    this.name = name || "unnamed"; 
    this.myNamespace = myNamespace; 

    // Initialize the namespace, we can leave this out and just reference 
    // obj.myNamespace() each time as well 

    this.myNamespace = this.myNamespace(); 
}; 

// Then you can just call the "namespace" and member function like this: 

var myObj = new obj("Mr Ahb Jeckt"); 
myObj.myNamespace.test(); 

var myObj2 = new obj("Mrs Ahb Jeckt"); 
myObj2.myNamespace.test(); 
1

Il n'y a pas de réponse simple, mais vous avez quelques options:

obj.namespace.test = function() { 
    return (function() { 
    // this == obj 
    }).apply(obj, Array.prototype.slice.call(arguments)); 
}; 

Cette retourne une fonction qui est lié à obj. Malheureusement, si obj est réaffecté, cela ne fonctionnera pas, car il s'agit d'une référence en direct. Ceci est plus robuste:

obj.namespace.test = (function (obj) { 
    return function() { 
    return (function() { 
     // this == obj 
    }).apply(obj, Array.prototype.slice.call(arguments)); 
    }; 
}(obj)); 

Comme vous pouvez le voir, aucun d'eux n'est très propre. Vous pourriez vous demander pourquoi vous dépendez de this pour commencer. L'utilisation d'une référence normale à obj est évidemment l'approche la plus directe.