如果未调用特定函数,则仅调用构造函数行为

时间:2012-11-17 21:40:15

标签: javascript oop

道歉 - 我不知道如何描述这一点。例如:

function OutputNumber(number) {
    this.outputThisInstead = function (otherNumber) {
        console.log(otherNumber);
    }
    console.log(number);
}

所需用法:


new OutputNumber(1);

控制台输出:1


new OutputNumber(1).outputThisInstead(2);

控制台输出:2


当然,1将始终写入控制台,而不管对象上还有其他内容。

我正在遵循这个特定的语法,以及行为 - 将函数附加到初始化。感觉不可能,因为在调用任何函数之前必须构造对象,但这是否可以通过其他方式实现?

3 个答案:

答案 0 :(得分:2)

可能会有时间延迟(例如,在浏览器环境中,setTimeout或类似)和标志。不是理想的,但可能。

没有它,不,你不能将构造函数的动作建立在尚未发生的事情上。你必须将一些东西传递给构造函数,让它知道发生了什么。

浏览器示例(再次,我不建议这样做):

function OutputNumber(number) {
    var handle = 0;
    this.outputThisInstead = function (otherNumber) {
        if (handle) {
            clearTimeout(handle);
            handle = 0;
        }
        console.log(otherNumber);
    }
    handle = setTimeout(function() {
        console.log(number);
    }, 0);
}

从您对该问题的评论:

  

这是我正在尝试的一系列链接对象/函数的结束。例如:

Assert.that(1).is.not(2).because('output this message if fails');
     

这里没有(2)返回一个对象,因为可以选择调用它。对象的行为取决于因为被调用。

链中的后续函数不是依赖于链中较早函数的行为,而是在某些内容的末尾添加.end()

Assert.that(1).is.not(2).because('output this message if fails').end();

end将输出先前函数存储/存储的任何消息/消息。不需要黑魔法。显然,这可能是因为人们可能无法启用.end(),但是如果您希望输出基于更改,则需要一些类型的触发器才可以执行输出在可选的后续函数调用上。

答案 1 :(得分:1)

不可能。当你执行new OutputNumber(1)时,该函数已被调用。链式方法无法访问其先前的调用。

答案 2 :(得分:1)

可以将outputThisInstead声明为“静态”:

function OutputNumber(number) {
    console.log(number);
}

OutputNumber.outputThisInstead = function (otherNumber) {
    console.log(otherNumber);
}

new OutputNumber(1); //1
OutputNumber.outputThisInstead(2); //2

但是如果你想用new运算符创建一个对象,该函数将始终记录number参数。

通过部分应用函数(here),您也可以实现与所需的行为类似的行为。这也称为Currying或Schönfinkeling。这个想法是你可以一个接一个地填充函数的参数,当完整的参数集可用时,函数正在执行。你可以看到一个令人讨厌的例子here