【问题标题】:TypeError: string is not a functionTypeError:字符串不是函数
【发布时间】:2012-12-14 10:33:20
【问题描述】:

在下面的代码中,第 30 行的TypeError: string is not a function var myColour = new colour(255,255,255); 被抛出。任何人都可以看到代码有什么问题。非常感谢。

var bodies = [];
var orbits = [];
var colours = [
    new colour(45, 45, 45),
    new colour(255, 0, 0),
    new colour(0, 157, 255),
    new colour(77, 250, 81),
    new colour(255, 247, 0)
];

function colour(red, green, blue)
{
    this.red = red;
    this.green = green;
    this.blue = blue;
};

window.onload = function() {
    var c = document.getElementById("theCanvas");
    var ctx = c.getContext("2d");
    ctx.beginPath();
    ctx.arc(95,50,40,0,2*Math.PI);
    ctx.stroke();
    for (var colour in colours){
        console.log(colour.red);
        console.log(colour.green);
        console.log(colour.blue);
    };
    var myColour = new colour(255,255,255);
    console.log(myColour.red);
    console.log(myColour.green);
    console.log(myColour.blue);
};

【问题讨论】:

    标签: javascript string object instantiation typeerror


    【解决方案1】:

    您在for...in 循环中有一个名为colour 的局部变量,这不是一个函数。将该变量更改为构造函数以外的其他内容,例如c,它会正常工作。您的代码,已更正:

    var bodies = [];
    var orbits = [];
    var colours = [
        new colour(45, 45, 45),
        new colour(255, 0, 0),
        new colour(0, 157, 255),
        new colour(77, 250, 81),
        new colour(255, 247, 0)
    ];
    
    function colour(red, green, blue)
    {
        this.red = red;
        this.green = green;
        this.blue = blue;
    };
    
    window.onload = function() {
        var c = document.getElementById("theCanvas");
        var ctx = c.getContext("2d");
        ctx.beginPath();
        ctx.arc(95,50,40,0,2*Math.PI);
        ctx.stroke();
        for (var c in colours){
            console.log(c.red);
            console.log(c.green);
            console.log(c.blue);
        };
        var myColour = new colour(255,255,255);
        console.log(myColour.red);
        console.log(myColour.green);
        console.log(myColour.blue);
    };​
    

    Demo

    【讨论】:

    • 谢谢,效果很好。虽然我注意到另一个问题。循环遍历颜色数组时,我得到“未定义”值。任何想法为什么?再次感谢。
    • @Nate 很确定这是因为您使用的是for...in 循环。在数组上使用普通的for 循环或forEach,它工作正常。我用过forEachhere
    • 你是正确的。将c.red 更改为colours[c].red 也有效。干杯
    【解决方案2】:

    for (var colour in colours) 中定义的局部变量colourhoistedonload 函数的开头,因此它将隐藏全局函数colour。将后者更改为Colour 将解决您的问题。此外,将用作Class 名称的函数的名称大写是一个很好的约定。

    【讨论】:

    • 谢谢。关于将“类”函数的名称大写的好技巧
    猜你喜欢
    • 2015-11-01
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 2018-02-26
    • 2015-05-25
    • 2014-05-18
    • 1970-01-01
    • 2021-02-27
    相关资源
    最近更新 更多