未捕获的TypeError:在单独的文件中包含javascript类时,undefined不是函数

未捕获的TypeError:在单独的文件中包含javascript类时,undefined不是函数,javascript,class,include,raphael,Javascript,Class,Include,Raphael,我不熟悉Javascript中的类,但我试图用Raphael创建一个简单的绘图应用程序。我目前遇到的问题是,一些代码在同一个文件中工作,但当我尝试将其取出并包含时,它会给我: Uncaught TypeError: undefined is not a function. 我的第一个想法是没有正确地包含该文件,所以我检查了一下,chrome的dev-helper工具很好地显示了该资源 代码位于一个名为line.js的文件中: function line(paper) { this.x

我不熟悉Javascript中的类,但我试图用Raphael创建一个简单的绘图应用程序。我目前遇到的问题是,一些代码在同一个文件中工作,但当我尝试将其取出并包含时,它会给我:

Uncaught TypeError: undefined is not a function. 
我的第一个想法是没有正确地包含该文件,所以我检查了一下,chrome的dev-helper工具很好地显示了该资源

代码位于一个名为line.js的文件中:

function line(paper) {
    this.x1 = null;
    this.x2 = null;
    this.y1 = null;
    this.y2 = null;

    this.paper = paper;
};

line.prototype.draw = function(){
    this.paper.path(
        "M " + this.x1 + " " + this.y1 +
        " l " + (this.x2 - this.x1) + " " + (this.y2 - this.y1) + " z"
    );
};
使用它的相关代码是:

<script type="text/javascript" src="../js/raphael-min2.1.js"></script>
<script type="text/javascript" src="../js/line.js"></script>

<script>
window.onload = function() {  
    var paper = new Raphael($('#canvas')[0], 500, 500);
    var canvas =$('#canvas');    
    var line = new line(paper);

    canvas.mousedown(function(e){
        line.x1 = e.offsetX;
        line.y1 = e.offsetY;
    });

    canvas.mouseup(function(e){
        line.x2 = e.offsetX;
        line.y2 = e.offsetY;
        line.draw();
    });
};
</script>

window.onload=函数(){
var paper=新拉斐尔($(#canvas')[0],500500);
var canvas=$(“#canvas”);
var行=新行(纸张);
canvas.mousedown(函数(e){
line.x1=e.offsetX;
第1行=e.offsetY;
});
canvas.mouseup(函数(e){
line.x2=e.offsetX;
line.y2=e.offsetY;
line.draw();
});
};

我以前从来没有在javascript中使用过类,也没有包含我自己制作的js文件,所以只要了解一下这件事,而不仅仅是修复就好了。此外,如果你认为有一个更好的方法,我怎么做,一般来说,请让我知道!非常感谢

发生此问题是因为对象的名称和类的名称相同。尝试为对象指定不同的名称,如下所示:

var newLine=new line(paper);

此外,当我尝试为对象和类赋予相同的名称时,我得到了TypeError:line不是Firebug中的构造函数,当我将代码放入line.js或window.onload之前的位置时,就会发生此错误。

这就解决了它,但为什么当我把它移到它自己的文件时它就停止工作了呢?Chrome的调试工具和Firebug之间有区别。我认为,当您将所有代码放在一个地方时,Chrome将line视为var line=newline()处的一个类;然后在代码的其余部分将其视为一个对象。按照惯例,我认为,如果您将函数用作构造函数(即,将“new”关键字放在它前面),则应该调用Line函数。这可能也会解决你的问题。