1

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

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

所需用途:


new OutputNumber(1);

控制台输出:1


new OutputNumber(1).outputThisInstead(2);

控制台输出:2


自然,1将始终写入控制台,而不管对象上还调用了什么。

我追求这种特殊的语法以及行为——将一个函数附加到初始化上。感觉不可能,因为必须在调用任何函数之前构造对象,但是这可以通过其他方式实现吗?

4

3 回答 3

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');

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

与其让链中较早函数的行为依赖于链中较晚的函数,我可能会.end()在某些内容的末尾添加一个:

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

end将输出先前函数存储的任何消息/消息。不需要黑魔法。显然,这会受到人们可能无法打开的事实的影响,但是如果您希望输出基于可选的后续函数调用而更改,则.end()您需要某种触发器来执行输出是可以的。

于 2012-11-17T21:44:50.933 回答
1

不可能。到您执行此操作时,new OutputNumber(1)该函数已被调用。链式方法将无法访问其先前的调用。

于 2012-11-17T21:47:32.880 回答
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参数。

您还可以通过部分应用该功能(此处)实现与您想要的类似的行为。这也称为 Currying 或 Schönfinkeling。这个想法是你可以一个接一个地填充函数的参数,当全套参数可用时,函数正在执行。你可以在这里看到一个柯里化的例子。

于 2012-11-17T21:53:14.910 回答