2015-05-03 10 views
2

Пример:Bind сфера функционировать вне вызова функции

var MyClass = (function() { 
    function MyClass() { 
     // construct 
    } 

    MyClass.prototype.clickEvent = function() { 
     this.doSomething(); 
    }; 

    MyClass.prototype.doSomething = function() { 
     // do something here 
    }; 

    return MyClass; 
})(); 

var mc = new MyClass(); 
$('my-ele').click(mc.clickEvent.bind(mc)); 

мне нужно, чтобы связать тс с mc.clickEvent, чтобы сделать эту работу. Есть ли другой способ сделать это? Он отлично работает, это было бы неплохо, если бы был способ определить область моей функции clickEvent(), не прибегая к привязке .bind (mc) при настройке функции события клика.

я видел что-то вроде этого:

MyClass.prototype.clickEvent = function() { 
    this.doSomething(); 
}.bind(this); 

, но это не сработало.

+0

@YauheniLeichanok Я сохраняю состояние со свойствами. Это будет работать без обертки, но мне это нужно. – user11406

+0

Если вопрос только касательно связан с jquery, не следует ли удалять тег? –

ответ

2

var MyClass = (function() { 
 
    function MyClass() { 
 
     this.clickEvent = this.clickEvent.bind(this); 
 
    } 
 

 
    MyClass.prototype.clickEvent = function() { 
 
     this.doSomething(); 
 
    }; 
 

 
    MyClass.prototype.doSomething = function() { 
 
     alert('something'); 
 
    }; 
 

 
    return MyClass; 
 
})(); 
 

 
var mc = new MyClass(); 
 
$('.my-ele').click(mc.clickEvent);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 

 
<a href=#" class="my-ele">test</a>

ли это для связывания всех его методов класса.

function MyClass() { 
    for (var i in this) { 
     if (typeof this[i] === 'function') { 
      this[i] = this[i].bind(this); 
     } 
    } 
} 
+1

Это прекрасно. Спасибо! – user11406

+2

@ user11406 Имейте в виду, что, делая это, вы эффективно блокируете метод и будущие изменения прототипа не будут видны ранее построенным экземплярам. –

0

Если вы используете mc.clickEvent, он будет работать так, как вы ожидаете. click фактически меняет привязку и явно называет bind так, как вы это говорите.

Вы также можете имитировать это с самого начала. (Это то, что Moogs answer делает

Простым способу, который может приблизиться бы обернуть вызов так:..

$('my-ele').click(function(i,e) { mc.clickEvent(i,e); }) 

Таким образом, в clickEventthis еще будет mc

0

Вашего последним фрагмент не работает, потому что вы не завернули функцию до вызова метода bind следующим образом:

function MyClass() { 
    this.clickEvent = (function() { 
     this.doSomething(); 
    }).bind(this); 
} 

Однако, это неэффективно, потому что для определения функции необходимо определить внутри конструктора, который не использует цепочку прототипов. Я просто почувствовал, что было бы полезно объяснить, почему ваш последний фрагмент не работал.

Смежные вопросы