比如我创建了一个自定义对象var myobj={
item:null,

self:null,

init:function(obj){
this.item=obj;
this.self=this;
this.addEvent.apply(this.item,['mousedown',this.bind]);
},        addEvent:function(type,listener){
if(this.addEventListener)
{
this.addEventListener(type,listener,false);
}
else
{
this.attachEvent('on'+type,listener);
}
},        bind:function(){

},
}在myobj初始化后执行addEvent绑定事件,然后问题就出现了,到bind函数里面,如果使用this,这个this是myobj.item,我要想访问自身,该怎么办?

解决方案 »

  1.   

    在外面定义一个var othis = this;
    里面就可以用othis了.
      

  2.   

    是的在全局顶一个 var othis = this; 但是貌似很浪费性能。。
      

  3.   

    记住addEvent是你的myobj的专有方法 不是给别人(其他对象)用的 
    如果是给大家一起用的 就要提取来 成为一个公共APIinit:function(obj){
            //。
            //this.addEvent('mousedown',this.bind]); 这个不要了 没意义
           var item=this.item;
           var me=this;
           if(item.addEventListener)
            {
                item.addEventListener('mousedown',function(){ me.bind(); },false);
            }
            else
            {
                item.attachEvent('onmousedown',function(){ me.bind(); } );    
            }    
            //对自己内部dom的绑定 就直接写 如果想套方法 就把 事件绑定 提取成公共的
            //注意上面me的用法
        },
      

  4.   

    var myobj = {
        item: null,
        
        self: null,
        
        init: function(obj) {
            this.item = obj;
            this.self = this;
            this.addEvent.apply(this.item, ['mousedown',this.wrapper(this, this.bind)]);
        },
    wrapper: function(target, fn) {
    return function() {
    fn.apply(target);
    }
    },
        addEvent: function(type, listener) {
            if (this.addEventListener) {
                this.addEventListener(type, listener, false);
            } else {
                this.attachEvent('on'+type,listener);    
            }
        },    bind: function(){
            
        }
    }
      

  5.   

    addEvent  不是为了注册事件嘛。。
    为什么不把这句this.addEvent.apply(this.item,['mousedown',this.bind]);
    直接换成 this.item.onmousedown = this.bind;    addEvent 方法应该可以去掉..还分浏览器那要考虑..不明白为什么  求解!!~
      

  6.   

      this.addEvent.apply(this.item,['mousedown',function(){var o = this;return function(){o.bind()}}.call(this)]);
      

  7.   

    还有一种方法,是ECMAScript5推荐的写法
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    <script type="text/javascript">
    function addEventListener(target, eventName, fn) {

    if (target.addEventListener) {
    target.addEventListener(eventName, fn, false);
    } else {
    target.attachEvent('on' + eventName, fn);
    }
    }

    window.onload = function() {
    var testObj = {
    name: "123",
    init: function() {
    var test = document.getElementById("test");
    addEventListener(test, "click", this.dispatch.bind(this));
    },
    dispatch: function() {
    alert(this.name);
    }
    };
    testObj.init();
    }

    </script>
    </head>
    <body>
    <div id="test" style="width:400px; height:300px; border-style:solid; border-width:1px; background-color:#ffffff"></div>
    </body>
    </html> Browser Support
    ○ Firefox 4
    ○ Internet Explorer 9
    ○ Chrome 7+
      

  8.   

    用你的方法又发现一个问题,就是想要解除绑定解除不了
    比如我这样:<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    <script type="text/javascript">
    var myobj = {
        item: null,
        
        self: null,

    pro:1,
        
        init: function(obj) {
            this.item = obj;
            this.self = this;
            this.addEvent.apply(this.item, ['mousedown',this.wrapper(this, this.bind)]);
    this.addEvent.apply(this.item, ['mouseup',this.wrapper(this, this.unbind)]);
        },

        wrapper: function(target, fn) {
            return function() {
                fn.apply(target);
            }
        },
        addEvent: function(type, listener) {
            if (this.addEventListener) {
                this.addEventListener(type, listener, false);
            } else {
                this.attachEvent('on'+type,listener);    
            }
        },

    removeEvent:function(type,listener)
    {
    if(this.removeEventListener)
    {
    this.removeEventListener(type,listener,false);
    }
    else
    {
    this.detachEvent('on'+type,listener);
    }
    },

        bind: function(){
            this.addEvent.apply(this.item, ['mousemove',this.wrapper(this, this.getEventPoint)]);
        },

    unbind: function(){
            this.removeEvent.apply(this.item, ['mousemove',this.wrapper(this, this.getEventPoint)]);
        },

    getEventPoint:function(event){
    var evt=event||window.event;
    document.getElementById('test').innerHTML=evt.clientX+":"+evt.clientY;
    }
    }
    window.onload=function(){
    var obj=document.getElementById('test');
    myobj.init(obj);
    }</script>
    </head>
    <body>
        <div id="test" style="width:400px; height:300px; border-style:solid; border-width:1px; background-color:#ffffff"></div>
    </body>
    </html>本意是想在框内按下鼠标时能监测鼠标位置,不按的时候解除绑定,不再监测,可是实际情况是会一直绑定着,不知道该如何解除。
    PS:因为在getEventPoint方法里还想用到对象本身,所以需要使用wrapper方法包装this。如果不用包装的话,能正常解除绑定的。
    另外,wrapper这个方法在chrome和IE8下使用没出问题,但firefox5似乎在 fn.apply(target);这一句停下来
      

  9.   

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    <script type="text/javascript">
    var myobj = {
        item: null,
        
        self: null,
        
        pro:1,
        
        init: function(obj) {
            this.item = obj;
            this.self = this;
            this.handler = this.wrapper(this, this.getEventPoint);
            this.addEvent.apply(this.item, ['mousedown', this.wrapper(this, this.bindMouse)]);
            this.addEvent.apply(this.item, ['mouseup', this.wrapper(this, this.unbindMouse)]);
        },
        bindMouse: function() {
         this.addEvent.apply(this.item, ["mousemove", this.handler]);
        },
        unbindMouse: function() {
         this.removeEvent.apply(this.item, ["mousemove", this.handler]);
        },
        wrapper: function(target, fn) {
            return function() {
                fn.apply(target, arguments);
            }
        },
        addEvent: function(type, listener) {
            if (this.addEventListener) {
                this.addEventListener(type, listener, false);
            } else {
                this.attachEvent('on' + type, listener);    
            }
        },
        
        removeEvent: function(type, listener) {
            if(this.removeEventListener) {
                this.removeEventListener(type, listener, false);
            }
            else {
                this.detachEvent('on' + type, listener);    
            }
        },
        
        getEventPoint:function(event) {
            var evt = event || window.event;
            this.item.innerHTML = evt.clientX + ":" + evt.clientY;
            
        }
    }
    window.onload = function() {
        var obj = document.getElementById('test');
        myobj.init(obj);
    }</script>
    </head>
    <body>
        <div id="test" style="width:400px; height:300px; border-style:solid; border-width:1px; background-color:#ffffff"></div>
    </body>
    </html>1.为什么this.addEvent这种自带的方法也要apply
    2.为什么this.addEvent会用this来引用
    3.你代码习惯非常的不好啊
    4.wrapper方法现在几乎可以用bind代替了