2015-09-05 38 views
1

我想一个参数绑定的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"); 
    }); 
}); 

第二个序列运行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); 
    }); 
} 

所以在这里我的问题是我怎么A了这个属性绑定为对象调用SequenceB我怎么创建的Sequence一个新的实例,并仍允许用户在函数内部定义?

cmd.call(e,new Sequence().bind(cmd)); //can not call bind from Constructor 

所以基本上我需要的用户仍然能够定义参数本身的Sequencethis被绑定到调用它的对象。有什么建议么?

编辑

http://jsbin.com/dulesejame

没有得到相同的结果,所以我现在可以俯瞰我的代码, 所以我已经编辑我的实际的JavaScript库中。它现在正在做。

打开开发人员面板以阅读控制台。按ctrl+a然后b,然后按ctrl+b按a,不显示任何,所以按b和它的运行ctrl+a seq功能。

+0

发表一些小提琴,如果可以的话!我无法确切地得到你的问题... – Buzinas

+0

是的,我总是有问题给我的问题。我会得到一个小提琴去 – EasyBB

+0

添加我的实际JavaScript代码的斌。 – EasyBB

回答

1

我可以告诉你的一个主要问题是使用相同的default对象,通过它你的commands.cmd[combinator]将指向最后一个相同的对象。

分配

var def = Object.create(defaults); 
for(var option in options) 
{ 
    if(option !== "executed" && option !== "called") 
    { 
    def[option] = options[option]; 
    } 
} 
+0

好吧,我会给你一个旋转。我忘了这一点,我刚刚回到Javascript,并认为使一个变量会创建一个基本上像通过引用等新的实例。 – EasyBB

+0

接受你的答案,因为你把我带到错误,虽然我没有使用这完全是我创建了一个新的对象字面值。谢谢@ code-jaff – EasyBB

0

意识到我做了什么后之前,确保default副本错误感谢的编写,JAFF它,因为他没有给我的办法了,我会接受他的答案。除了使用Object.create之外,我刚刚创建了一个新的对象字面值。

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]; 
    } 
} 
相关问题