2014-03-05 72 views
0

我需要創造一個對象每次有人點擊一個按鈕:創建一個對象一次,然後再使用它會導致對象不是一個函數錯誤

var button = document.getElementsByTagName('button')[0]; 
button.onclick = function() { 
    new testobj(args); 
} 

function testObj(args) { 

} 

testObj.protoype.method = function() { 
    //... 
} 

但似乎浪費保持每次創建新對象按鈕被單擊(主要是因爲該對象只是接收一個值並對其執行操作並返回)。我想知道是否有一種方式來創建上首次對象單擊該按鈕,然後在隨後的點擊只需再次運行該對象以某種方式......

所以,我想這一點:

var testobj; 

function test(thing) { 

    var self = this; 

    if(!testobj) { 
     testobj = new thing(thing); 
    } else { 
     testobj(thing); 
    } 

} ;

這只是分配的事情對象到testobj VAR第一次測試()運行......之後,我只是嘗試再次調用testobj ......但我得到一個對象不是一個函數錯誤錯誤。這裏完整的測試http://jsfiddle.net/pstbj/1/

我明白爲什麼我會收到錯誤,因爲testobj是一個對象而不是函數。有沒有什麼辦法可以讓這個工作像我想的那樣...所以我只創建一個對象。

或者可能創建一個新對象並不是那麼糟......我在想象不需要不停地創建對象是不好的做法嗎?我想我需要緩存對象...

回答

1

只有在實例化對象時調用構造函數。如果你想重用對象,你要初始化它第一次(做初始化),然後調用一個實例方法的實際工作」

var testobj; 

function test(thing) { 

    var self = this; 

    if(!testobj) { 
     testobj = new testObj(); 
    } 

    testobj.someMethod(thing); 
}; 

但是,除非你的構造函數是真貴,我不擔心響應用戶點擊的性能並跳過緩存。

1

這是因爲new thing()返回一個常規的對象,而不是一個函數。

你應該做的只是在初始化後使用對象。

var my_object; 

function Thing() { 
    this.thing = 'a sentence'; 
    console.log('calling'); 
} 

Thing.prototype.amethod = function() { 
    this.thing = 'a method of thing' 
} 

// new test(); // not necessary 

var button = document.getElementsByTagName('button')[0]; 
button.onclick = function() { 
    if (!my_object) 
     my_object = new Thing(); 

    // do some work with my_object 
} 
相關問題