web-dev-qa-db-fra.com

Javascript appelant des fonctions de prototype dans le constructeur

Je reçois toujours une erreur en disant que mes fonctions ne sont pas définies lorsque j'essayais d'appeler les fonctions prototypes dans le constructeur et je ne sais pas ce qui ne va pas.

Voici le code que j'ai:

function Renderer()
{
    initialiseWebGL();
    initialiseShader();
    initialiseBuffer();
}

Renderer.prototype.initialiseWebGL()
{
    //Do stuff.
};

Renderer.prototype.initialiseShader()
{
        //Do Shader's stuff
};

Renderer.prototype.initialiseBuffer()
{
        //Do Buffers
};

Qu'est-ce qui va pas avec ça?

32
Danny

Votre syntaxe est incorrecte. Utilisez ceci:

function Renderer() {
    this.initialiseWebGL();
    this.initialiseShader();
    this.initialiseBuffer();
}

Renderer.prototype.initialiseWebGL = function () {
    //Do stuff.
};

Renderer.prototype.initialiseShader = function () {
        //Do Shader's stuff
};

Renderer.prototype.initialiseBuffer = function () {
        //Do Buffers
};

Après cela, vous pouvez créer un nouvel objet et l'utiliser en:

var rendererInstance = new Renderer();
51
Minko Gechev

Il y a quelques problèmes avec votre code

1 .initialiseWebGl() rechercherait une fonction déclarée dans la portée globale -> il n'y a pas de fonction

  • Vous devez utiliser this.initialiseWebGl() pour accéder à la méthode Objects
    Remarque: this fait référence à l'instance de Renderer dans ce cas

2. Vous n'affectez pas une fonction avec Renderer.prototype.initialiseWebGL() à la place, vous essayez d'appeler la méthode prototype Renderers initialiseWebGl qui vous donne une erreur, car elle n'est pas définie

3.Parce que les { Sont déplacés vers le bas d'une ligne, ils sont interprétés comme un bloc -> ce code est exécuté.
Si vous les aviez après votre (), Vous obtiendriez une erreur de syntaxe -> Renderer.prototype.initialiseWebGL() {... entraînerait Uncaught SyntaxError: Unexpected token {

Voici un exemple commenté

function Renderer() {
    initialiseWebGL(); // I call the global declared function
    this.initialiseShader(); //I call the Prototypes function
    this.initialiseBuffer(); //Me too
}

Renderer.prototype.initialiseWebGL = function (){ //Here a function gets assigned to propertie of `Renderer`s `prototype` Object
    //Do stuff.
};

Renderer.prototype.initialiseShader = function (){
        console.log("Do Shader Stuff");
};

Renderer.prototype.initialiseBuffer = function (){
        console.log("Do initialise stuff");
};
 Renderer.prototype.initialiseBuffer() // I invoke the method above
{
 console.log("I'm a Block statement");
}; 

function initialiseWebGL () { //I'm the global declared function
  console.log("Global");
}

var ren1 = new Renderer();

/*"Do initialise stuff"  
"I'm a Block statement"  
"Global"  
"Do Shader Stuff"  
"Do initialise stuff"*/

Comme vous pouvez le voir dans la sortie des consoles

Voici un JSBin

11
Moritz Roessler

Puisque vos instances héritent de la (méthode) propriétés des objets prototypes, vous devez y accéder en tant que propriétés et non en tant que variables simples:

function Renderer() {
    this.initialiseWebGL();
    this.initialiseShader();
    this.initialiseBuffer();
}
4
Bergi