2014-07-24 1 views
0

j'ai un prototype avec 3 méthodes comme ci-dessous,Numéro privé pour un prototype en javascript

ej.Ej3DRender = function() { 


}; 
ej.Ej3DRender.prototype = { 

     matrix3D: function (size) {   

       mData += 3; 
     }, 
     getIdentity: function() { 
      mData+=4; 
     }, 
     turn: function (angle) { 
      mData+=6; 
     } 
    } 

Est-il possible de partager une variable commune à toutes les méthodes du prototype? Dans le code ci-dessus, je dois utiliser le "mData" dans toutes les méthodes, alors où puis-je le déclarer? et il devrait être accessible uniquement dans ce prototype.

Merci à l'avance

Répondre

0

La réponse courte est - Non vous ne pouvez pas le faire dans le bon sens.

La réponse longue:

Vous pouvez déclarer la variable comme privée avec mot-clé var dans le constructeur de funciton mais les autres fonctions doivent être déclarées dans le

ej.Ej3DRender = function() { 
    var mData = 0; 

    this.matrix3D = function(size) { mData += 3 }; 
    // .. other functions that access mData 
}; 

Notez que cela est considéré comme une pratique très mauvaise car les fonctions sont créées et attachées pour chaque objet nouvellement créé.

En JavasScript est accepté pour préfixer les membres privés avec le caractère de soulignement '_'. Vous pouvez essayer cette approche (qui n'aura pas les problèmes de performance avec la création de fonctions à chaque fois, la variable sera visible 'à l'intérieur' ET 'à l'extérieur' du prototype mais alors qu'il est préfixé avec un underscore, le développeur ne doit pas toucher la variable à l'extérieur):

ej.Ej3DRender = function() { 
    this._mData = 0; 
}; 

ej.Ej3DRender.prototype = { 
    matrix3D: function (size) {   
     this._mData += 3; 
    }, 
    getIdentity: function() { 
     this._mData += 4; 
    }, 
    // ... other functions 
} 
+0

Votre réponse est erronée, il est possible de le faire. Je vais ajouter une réponse. Notez que l'OP a besoin d'une variable SHARED – HMR

+0

Je suis à peu près sûr que OP veut que la variable partagée entre les méthodes de l'instance concrète ne soit pas partagée entre toutes les instances. Cependant, la question n'est pas suffisamment claire et doit être modifiée par OP. –

+0

Pourrait être partagé sur un prototype signifie généralement partagé par les instances, mais peut-être le PO ne le sait pas. Pour plusieurs instances privées spécifiques, il est possible de créer une seule fermeture qui verrouille les membres privés dans une boîte. Un motif similaire au motif protégé dans ma réponse. Je n'aime pas beaucoup le privé car cela pourrait affecter négativement les tests et les patchs de singe – HMR

0

Est-il possible de partager une variable commune à toutes les méthodes du prototype ?

Oui, c'est possible. Si la valeur est partagée (non instance spécifique) et vous avez besoin pour être privé, vous pouvez envelopper les fonctions qui en ont besoin dans une Ia vie

var Test = function(){}; 
Test.prototype.notHavingTheVar=function(){ 
    console.log(typeof sharedPrivate); 
} 

//IIFE 
;(function(){ 
    var sharedPrivate=22; 
    Test.prototype.onePrivilegedFn=function(){ 
    console.log(++sharedPrivate); 
    }; 
    Test.prototype.twoPrivilegedFn=function(){ 
    console.log(++sharedPrivate); 
    }; 
}()); 
var t = new Test(); 
t.notHavingTheVar();//=undefined 
t.onePrivilegedFn();//=22 
t.twoPrivilegedFn();//=23 
//it is shared so not instance specific 
var t2 = new Test(); 
t2.twoPrivilegedFn();//=24 <<<====please note, it's shared 

En savoir plus sur les fonctions constructeur, prototype et un modèle, par exemple, les membres protégés spécifiques peuvent être trouvé here.

Les membres spécifiques d'instance privée ne sont pas accessibles depuis le prototype.