对象的Javascript替换';s法

对象的Javascript替换';s法,javascript,object,methods,Javascript,Object,Methods,我对javascript中对象的操作有问题 我的代码: SearchField = function(){ this.Init = function() { this.input = this.view.getElementsByTagName("input"); this.input[0].onkeyup = this.UpdateEvent2; self = this; } this.UpdateEvent = fun

我对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");
};  
}

对这段代码的一些解释:我使用bind方法作为参数传递对象本身,而不是事件对象。 所以,我有一个函数OnUpdate,里面有一些代码

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

...
targetController.prototype[targetMethodName] = function(targetController){
alert("core");
return selfController[selfMethodName](targetController);
}
...
其中targetController是对my object的引用,targetMethodName是一个OnUpdate()方法。然后我试着给这个方法分配一个新函数,换句话说,试着用另一个对象的另一个方法替换原来的OnUpdate方法。(它不满足,因为它无论如何都不工作,甚至调用警报(“核心”))

所以,当我尝试像这样调用此方法时:MyObject.OnUpdate()-结果是一个带有“Hello world from direct object”的警报窗口

第一个问题是我如何用另一个方法来代替这个方法

但是,如果我将此方法直接分配给事件处理程序,会有一些有趣的行为,如下所示:

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");
};  
}

在本例中,所有操作都非常完美,因此我有一个内部带有“core”的警报窗口,以及另一个使用正确参数调用的另一个对象的方法

所以,第二个假设是。。。第一种变体有什么问题???我不想将我的方法直接分配给事件处理程序!我不想在代码的任何部分调用这个方法!如何做到这一点


另外,正如你所看到的,我试着用赛尔夫来做这个,而不是这个,等等。。。没什么帮助

在创建类后,您是否试图覆盖keyup函数

一种方法是使用原始函数初始化,然后覆盖它:

<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>

var SearchField=函数(id){
this.init=函数(){
var me=这个;
this.el=document.getElementById(id);
this.input=this.el.getElementsByTagName('input');
this.input[0]。addEventListener('keyup',函数(e){
me.onKeyUp(e);
});
self=这个;
}
this.onKeyUp=函数(e){
console.log('onKeyUp');
};
this.init();
};
var search1=新搜索字段(“字段”);
var search2=新的搜索字段(“字段2”);
//覆盖向上键功能
search2.onKeyUp=函数(e){
console.log('onKeyUp2');
};

有一件事我不明白,就是你把新方法放在targetController.prototype上,而不是实例本身。Grape_mao,在那些行之前,对象已经创建了,但没有用Init()方法初始化,所以我把新方法放在具体对象的实例上,而不是放在类对象或targetController.prototype上。但是事件处理程序设置之后!通过调用Init()方法。当然,如果我以前调用Init,它将始终指向初始函数,即使我在第二个变量中进行了替换!我还是不明白…这就是你想做的吗?如果仍然有问题,JSFIDLE复制它会有很大帮助。我没有看到任何结果,但有一些变化:事件不是在调用Init()时发生的,而是在按下键时发生的。。。Init只是设置回调。