从构造函数调用条件方法

时间:2015-07-14 20:01:56

标签: javascript

我正在尝试做一些非常简单但却无法实现的事情。

var Dummy = function() {
    self = this;
    setTimeout(function() {

        if(self.render) {
            self.render(); 
        }
    }, 10);
};
var test = new Dummy();
test.render = function() {
    console.log('Make constructor call this method? ');   
}

如何在没有settimeout的情况下完成这项工作?

目标:根据附加到实例的函数名称,我想按特定顺序调用它们。

例如:

var Dummy = function() {
    if(function1) {
       function1();
    }
    if(function2) {
       function2();
    }
};

3 个答案:

答案 0 :(得分:2)

你的问题并不完全清楚,但我假设你有一个你希望在实例化对象后立即调用的函数。最简单的方法是将函数作为参数传递

类似的东西:

var Dummy = function(myFunction) {
    self = this;
    self.render = myFunction;     // if you want to be able to call it again later
    self.render();                // if you want to call it now
};

var test = new Dummy(function() {
    console.log('Make constructor call this method? ');   
});

var anotherTest = new Dummy(function() {
    console.log("this instance will have a different render function");
});

现在,当然,这可以扩展到处理传入的任意数量的函数:

var Dummy = function(func1, func2) {
   // Note: you may want to check the arguments actually are functions
   if (func1) {
       func1();
   }
   if (func2) {
       func2();
   }
}

var test = new Dummy(function() { console.log("1"); },
    function() { console.log("2"); });

或者您可以按照您希望它们执行的顺序传递一系列函数:

var Dummy = function(funcArray) {
    for (var i=0; i < funcArray.length; i++) {
        funcArray[i]();
    }
}

var test = new Dummy([function() { console.log("1"); },
    function() { console.log("2"); }]);

或者你可以使用你想要的函数(和名称)传入一个对象:

var Dummy = function(funcObject) {
    if (funcObject.func1) {
        funcObject.func1();
    }
    if (funcObject.func2) {
        funcObject.func2();
    }
}

var test = new Dummy({ func1 : function() { console.log("1"); },
    func2: function() { console.log("2"); });

答案 1 :(得分:2)

我不确定你要做什么,但如果你要做的是在实例化object instance of Dummy时调用多个函数(按顺序):

var Dummy = function() {
     for (var i = 0; i < arguments.length; i++) {
        if (typeof arguments[i] === "function") {
             arguments[i]();
        }
     }
}

var function1 = function() { console.log('Func 1 executed!'); }
var function2 = function() { console.log('Func 2 executed!'); }

var d = new Dummy(func1, func2, 'maybe a string also');

// log
'Func1 executed!'
'Func2 executed!'

答案 2 :(得分:0)

因为您在render()Dummy instance)上添加了test方法,而您甚至没有调用render()方法。

我认为您需要更改为以下内容(假设您不想使用prototype创建render()方法):

var Dummy = function() {

    this.render = function() {
        console.log('Make constructor call this method called? ');   
    };

    self = this;

    setTimeout(function() {
        console.log(self);
        self.render(); 
    }, 10);
};
var test = new Dummy();