2016-01-09 3 views
1

Я пытаюсь написать и изучить с использованием Object.prototype, и я получаю сообщение об ошибке, что this.issue не является функцией, когда я вызываю ее в другом методе. Что я делаю неправильно, что вызывает его через этот Uncaught TypeError?Uncaught TypeError * не является функцией

Javascript:

$(document).ready(function() { 
    var Example = function() { 
     this.number1 = null; 
     this.number2 = null; 
    }; 

    Example.prototype.issue = function() { 
     //Logic is here... 
    }; 

    Example.prototype.updateNumber = function() { 
     //more logic is here... 
     this.issue(); 
    }; 

    Example.prototype.updateSign = function() { 
     //logic here... 
     this.issue(); 
    }; 

    (function() { 
     var solution = new Example(); 

    })(); 

}); 

UPDATE: https://jsfiddle.net/czLtc82y/

+0

Вы можете воспроизвести его в JSFiddle? Это облегчит поиск проблемы – Pikamander2

+3

, так как она полна «псевдокода», а действительная часть кода, которую вы представили, действительна, нет шансов получить ответ –

+2

@ Pikamander2 Я создам один прямо сейчас – user3897842

ответ

1

В обработчиках, присоединенных к change событию для #sign, .number

Example.prototype.newNumber = function(event) { 
    if (event.currentTarget.id === 'number1') { 
     this.number1 = parseFloat($(event.currentTarget).val()); 
    } 
    else { 
    this.number2 = parseFloat($(event.currentTarget).val()); 
    } 
    this.issue(); 
}; 

Example.prototype.newSign = function(event) { 
    this.sign = $(event.currentTarget).val(); 
    this.issue(); 
}; 

this ссылка #sign, .number элементов, не new Example объективистских т создатель

var problem = new Example(); 

Попробуйте использовать Function.prototype.bind() установить this в new Example(): problem в пределах .change() обработчиков

(function() { 

    var problem = new Example(); 

    $("#sign").change(problem.newSign.bind(problem)); 

    $(".number").change(problem.newNumber.bind(problem)); 

})(); 

jsfiddle https://jsfiddle.net/czLtc82y/1/


В качестве альтернативы, используя $.proxy()

(function() { 
    var problem = new Example(); 

    $("#sign").change($.proxy(problem.newSign, problem)); 

    $(".number").change($.proxy(problem.newNumber, problem)); 

})(); 

jsfiddle https://jsfiddle.net/czLtc82y/2/

+2

Возможно, вам захочется расширить, почему это необходимо. –

+1

@FelixKling Смотреть обновленное сообщение – guest271314

+0

Спасибо @ guest271314 за ответ и за разъяснения! – user3897842

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