Javascript在构造函数中调用原型函数

时间:2013-01-21 14:50:45

标签: javascript class methods prototype

当我试图在构造函数中调用原型函数时,我一直收到错误,说我的函数没有定义,我不知道它有什么问题。

这是我的代码:

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

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

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

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

它出了什么问题?

3 个答案:

答案 0 :(得分:50)

你的语法错了。使用此:

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
};

之后,您可以创建新对象并通过以下方式使用它:

var rendererInstance = new Renderer();

答案 1 :(得分:11)

您的代码存在一些问题

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

正如您在控制台中看到的输出

继承人JSBin

答案 2 :(得分:4)

由于您的实例从原型对象继承(方法)属性,您需要将它们作为属性而不是纯变量来访问:

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