function OutputNumber(number) {
this.outputThisInstead = function (otherNumber) {
console.log(otherNumber);
}
console.log(number);
}
所需用法:
new OutputNumber(1);
控制台输出:1
new OutputNumber(1).outputThisInstead(2);
控制台输出:2
当然,1
将始终写入控制台,而不管对象上还有其他内容。
我正在遵循这个特定的语法,以及行为 - 将函数附加到初始化。感觉不可能,因为在调用任何函数之前必须构造对象,但这是否可以通过其他方式实现?
答案 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。