创建一次对象然后重新使用它会导致对象不是函数错误

时间:2014-03-05 23:26:28

标签: javascript

每次有人点击按钮时我都需要创建一个对象:

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第一次运行test()运行...之后我只是尝试再次调用testobj ...但是我得到一个对象不是函数错误错误。完整测试http://jsfiddle.net/pstbj/1/

我理解为什么我会收到错误,因为testobj是一个对象而不是一个函数。有没有办法让我按照自己的意愿工作...所以我只创建一次对象。

或者创建一个新对象并不是那么糟糕......我在想,不必要地继续创建对象并不是一个好习惯吗?我想我需要缓存对象......

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:1)

只有在实例化对象时才调用构造函数。如果要重用该对象,则需要在第一次实例化它(进行初始化),然后为实际工作调用实例方法“

var testobj;

function test(thing) {

    var self = this;

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

    testobj.someMethod(thing);
};

但是除非你的构造函数真的很贵,否则我不会担心响应用户点击并跳过缓存的性能。