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

Dan*_*nny 33 javascript methods prototype class

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

这是我的代码:

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

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

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

Renderer.prototype.initialiseBuffer()
{
        //Do Buffers
};
Run Code Online (Sandbox Code Playgroud)

这有什么问题?

Min*_*hev 52

你的语法错了.用这个:

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
};
Run Code Online (Sandbox Code Playgroud)

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

var rendererInstance = new Renderer();
Run Code Online (Sandbox Code Playgroud)

  • 严格来说逻辑是错误的,而不是语法;) (10认同)
  • 如果你在没有 `new` 运算符的情况下调用 `MyClass`,它将使用全局对象的上下文来调用(即,如果你使用浏览器,则为 `window.MyClass`)。很可能`window.doThing` 不存在。但是,如果您使用 `new MyClass()`,则上下文 (`this`) 将是一个对象,它是构造函数的实例,因此 `doThing` 将作为 `this.__proto__` 的属性存在。 (4认同)

Mor*_*ler 11

您的代码存在一些问题

1. initialiseWebGl() 将寻找在全局范围内声明的函数 - >没有函数

  • 您应该使用this.initialiseWebGl()访问对象方法
    注意:在这种情况下this引用实例Renderer

2.你没有分配一个函数Renderer.prototype.initialiseWebGL()而是试图调用Renderers原型方法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"*/
Run Code Online (Sandbox Code Playgroud)

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

这是一个JSBin