2013-03-22 177 views
2

我想實例化同一對象的多個實例。第一個實例工作正常,但是當我嘗試初始化另一個對象,我得到這個錯誤,Javascript - 不能實例化同一對象的多個實例

Uncaught TypeError: Object #<draw> has no method 'width'

這裏是fiddle,這裏是我的代碼:

function halo() { 
    var width = 720, // default width 
     height = 80; // default height 

    function draw() { 
    // main code 
    console.log("MAIN"); 
    } 

    draw.width = function(value) { 
    if (!arguments.length) return width; 
    width = value; 
    return draw; 
    }; 

    draw.height = function(value) { 
    if (!arguments.length) return height; 
    height = value; 
    return draw; 
    }; 

    return draw; 
} 

var halo = new halo(); 
halo.width(500); 

var halo2 = new halo(); 
halo2.width(300); 

綜上所述,我的目標是實例化同一個「類」的多個實例。

回答

8

您正在重新定義halo cunstructor:

var halo = new halo(); // <-- change variable name to halo1 
halo.width(500); 

var halo2 = new halo(); 
halo2.width(300); 

修正版本:http://jsfiddle.net/GB4JM/1/

+0

難道不應該被'返回新'暈'的底部繪製'? – FakeRainBrigand 2013-03-22 05:51:11

+0

不是,在這種情況下,這不是我們所需要的。 'return draw'就好像它是'return {width:function(){},height:function(){}}'一樣。 – dfsq 2013-03-22 06:00:21

+0

啊,對不起。你是對的。我在想原型。 – FakeRainBrigand 2013-03-22 06:01:14

4

我建議結構性的東西多一點這樣的:

Halo = (function() { 
    function Halo(width, height) { 
    this.width = width || 720; // Default width 
    this.height = height || 80; // Default height 
    } 

    Halo.prototype = { 
    draw: function() { 
     // Do something with this.width and this.height 
    } 
    }; 

    return Halo; 
})(); 

var halo = new Halo(500, 100); 
halo.draw(); 

var halo2 = new Halo(300, 100); 
halo2.draw(); 
+0

你爲什麼這麼說?這樣做會有什麼好處,而不是我現在這樣做的方式? – John 2013-03-22 08:38:48

+1

@約翰,這是做類似事物的標準方式。它可以讓其他人更好地理解你的代碼,並且可以更容易地將其合併到其他代碼中。例如,如果您以後決定繼承,這可以讓您使用現有的框架,教程和指南。你不需要這樣做,它只是普遍的首選(爲什麼我對你的代碼感到困惑)。 – FakeRainBrigand 2013-03-25 13:47:22

+0

好的,理解。感謝您花時間解釋這一點。你不會知道這個話題有什麼好的學習資源,對嗎?我可以只是谷歌,但是那裏有不少文章,都說明他們的方法是最好的,而且很難辨別出遵循哪個「標準」。 :/ – John 2013-03-27 06:38:04