Подтвердить что ты не робот

Javascript, вызывающий прототипы функций в конструкторе

Я продолжаю получать ошибку, говоря, что мои функции не определены, когда я пытался вызвать функции прототипа в конструкторе, и я не знаю, что с ним не так.

Вот код, который у меня есть:

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

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

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

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

Что с ним не так?

4b9b3361

Ответ 1

Ваш синтаксис неверен. Используйте это:

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

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

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

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

После этого вы можете создать новый объект и использовать его:

var rendererInstance = new Renderer();

Ответ 2

В вашем коде

есть несколько ошибок.

1. initialiseWebGl() будет искать функцию, объявленную в Глобальной области видимости → нет функции

  • Вы должны использовать this.initialiseWebGl() для доступа к методу объектов
    Примечание: this относится к экземпляру Renderer в этом случае

2. Вы не назначаете функцию с помощью Renderer.prototype.initialiseWebGL(), вместо этого вы пытаетесь вызвать метод прототипа Renderer initialiseWebGl, который дает вам ошибку, поскольку ее не определено

3.В случае, когда { перемещаются по строке, они интерпретируются как Блок → этот код выполняется.
Если бы вы получили их после вашего (), вы получили бы синтаксическую ошибку → Renderer.prototype.initialiseWebGL() {... приведет к Uncaught SyntaxError: Unexpected token {

Вот комментарий:

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"*/

Как вы можете видеть на выходе консолей

Heres a JSBin

Ответ 3

Так как ваши экземпляры наследуют свойства метода (метода) от объектов прототипа, вам нужно получить к ним доступ как свойства, а не как простые переменные:

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