Javascript 像这样绑定一个参数,使用一个新的构造函数?
我正在尝试将Javascript 像这样绑定一个参数,使用一个新的构造函数?,javascript,call,bind,Javascript,Call,Bind,我正在尝试将this的一个参数绑定到名为Sequence的函数。绑定工作正常,问题是不止一个Sequence会相互覆盖,因此我必须使用new这是问题所在 //js code function init(cmd) { cmd.exec.call(e,Sequence.bind(cmd)); } 示例 init({ exec:function(seq){ seq("a",function(){ console.log(this);// ret
this
的一个参数绑定到名为Sequence
的函数。绑定工作正常,问题是不止一个Sequence
会相互覆盖,因此我必须使用new
这是问题所在
//js code
function init(cmd) {
cmd.exec.call(e,Sequence.bind(cmd));
}
示例
init({
exec:function(seq){
seq("a",function(){
console.log(this);// returns init object itself
});
}
});
很好,但当我这样做的时候
//init for js above
...,function(seq) {
seq("a",function(){
console.log ("hello");
},document.getElementById("google"));
});
...,function(seq) {
seq("d",function(){
console.log("goodbye");
});
});
第二个序列是运行再见
。从来没有第一次,因为它正在被改写
序列功能
function Sequence(key, fn, location) {
if (!location) location = document;
var self = this; //object that is bound to Sequence
location.addEventListener("keydown", function sequenceMode(e) {
if(self.waiting)
{
if (keyCodes.literal[key.toUpperCase()] === e.which) {
fn.call(self,e);
self.waiting = false;
this.removeEventListener("keydown", sequenceMode);
}
} else location.removeEventListener("keydown", sequenceMode);
});
}
因此,我这里的问题是如何将this属性绑定为调用Sequence
或B
的对象,如何创建Sequence
的新实例,并且仍然允许用户在函数内部定义
cmd.call(e,new Sequence().bind(cmd)); //can not call bind from Constructor
所以基本上我需要让用户仍然能够定义Sequence
的参数,并且this
绑定到调用它的对象。有什么建议吗
编辑
没有得到相同的结果所以我现在忽略了我的代码,
因此,我用我的实际JavaScript编辑了bin。它现在正在做
打开开发人员面板以读取控制台。按
ctrl+a
然后按b,然后按ctrl+b
按a,不显示任何,所以按b,它运行ctrl+a
seq函数。我可以告诉你的一个主要问题是使用相同的默认对象,通过该对象,你的命令.cmd[combinator]
将指向最后出现的同一个对象
分配前,复制一份默认值
var def = Object.create(defaults);
for(var option in options)
{
if(option !== "executed" && option !== "called")
{
def[option] = options[option];
}
}
在意识到我做错了什么之后,感谢代码jaff,我会接受他的答案,因为他确实给了我通往它的路。除了使用Object.create之外,我刚刚创建了一个新的Object-literal
var def = {};
for(var option in defaults)
{
if(options.hasOwnProperty(option) && option !== "executed" && option !== "called" && option !== "waiting")
{
def[option] = options[option];
} else {
def[option] = defaults[option];
}
}
如果可以的话,发一些小提琴吧!我不能完全理解你的问题…是的,我总是很难说出我的问题。我会用我实际的JavaScript代码在垃圾桶里放一把小提琴。好吧,我来试试。我忘记了这一点,我刚刚回到Javascript,我认为创建一个变量会创建一个新实例,基本上就像通过引用传递一样。接受了你的答案,因为你导致了错误,虽然我没有完全使用这个,但我创建了一个新的对象文本。谢谢@code jaff