2013-10-16 96 views
3

我在JavaScript中使用对象的操纵问题的Javascript替代

我的代码:

SearchField = function(){ 
this.Init = function() 
{ 
    this.input = this.view.getElementsByTagName("input"); 
    this.input[0].onkeyup = this.UpdateEvent2; 
    self = this;       
} 

this.UpdateEvent = function(){ 
    this.OnUpdate(); 
} 

this.UpdateEvent2 = this.UpdateEvent.bind(this); 

this.OnUpdate = function(){ 
    alert("Hello world from direct object"); 
}; 

}

的一些解释此代码:我使用的绑定方法为通过参数对象本身,而不是事件对象。 所以,我有一个OnUpdate函数,里面有一些代码。

我在我的代码一些其他部分对象实例化后,我有一些其他的行:

... 
targetController.prototype[targetMethodName] = function(targetController){ 
alert("core"); 
return selfController[selfMethodName](targetController); 
} 
... 

哪里targetController是我的对象的引用和targetMethodeName是一种方法的OnUpdate()。然后,我尝试为此方法分配一个新函数,换句话说,尝试用另一个对象的另一个方法替换原始方法OnUpdate。 (它并不是无论如何都不工作,即使调用alert(“核心”)。)

所以,当我尝试调用这样的方法:MyObject.OnUpdate() - result is带有“来自直接对象的Hello World”的警报窗口。

第一个问题是我该如何用另一个替代此方法?

但是,还有一些有趣的行为,如果我直接给这个方法事件处理程序是这样的:

SearchField = function(){ 
this.Init = function() 
{ 
    this.input = this.view.getElementsByTagName("input"); 
    this.input[0].onkeyup = this.OnUpdate; 
    self = this;       
} 


this.OnUpdate = function(){ 
    alert("Hello world from direct object"); 
}; 

}

在这种情况下,一切完美的作品,所以我有一个警告窗口“核心“内部和另一个方法从另一个对象调用正确的参数...

所以,第二个quastion是......第一个变种有什么错?我不想将我的方法直接分配给事件处理程序!我想在我的代码的任何部分调用这个方法!这个怎么做?

P.S.正如你所看到的,我试图用自己而不是这个来做这个,等等......没有什么帮助!

+0

有一件事我不明白的是你把新方法上targetController.prototype而不是实例本身。 –

+0

Grape_mao,在这些行之前该对象已经创建,但没有被Init()方法初始化,所以我将新方法放到具体对象的实例中,而不是放到类对象或targetController.prototype中。但之后的事件处理程序设置!通过调用Init()方法。这是做'当然,如果我以前调用Init,它会始终指向初始函数,即使我在第二个变体中做这个替换! –

+0

我还是不明白......这是你想要做的吗? http://jsfiddle.net/m5XYe/ –

回答

0

看起来你正试图在类创建后覆盖一个关键函数?你可以这样做

一种方式是与原函数初始化,然后将其覆盖:

<div id="field"> 
    <input type="text" value="search1" /> 
</div> 

<div id="field2"> 
    <input type="text" value="search2" /> 
</div> 

<script> 
var SearchField = function (id) { 
    this.init = function() { 
     var me = this; 
     this.el = document.getElementById(id); 
     this.input = this.el.getElementsByTagName('input'); 
     this.input[0].addEventListener('keyup', function (e) { 
      me.onKeyUp(e); 
     }); 
     self = this; 
    } 
    this.onKeyUp = function (e) { 
     console.log('onKeyUp'); 
    }; 
    this.init(); 
}; 

var search1 = new SearchField('field'); 

var search2 = new SearchField('field2'); 

// overwrite the key up function 
search2.onKeyUp = function(e) { 
    console.log('onKeyUp2'); 
}; 
</script> 

http://jsfiddle.net/kmturley/CHK96/