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