【问题标题】:Javascript: Object has no method when using prototypesJavascript:使用原型时对象没有方法
【发布时间】:2011-07-13 21:35:52
【问题描述】:

为什么我必须调用 new Chart() 来触发同一个类中的方法(例如)?这是正确的方法吗?谢谢。

  function Chart(location, startDateString, endDateString) {  

    this.location = location;
    this.startDateString = startDateString;
    this.endDateString = endDateString;
}


Chart.prototype.fnDrawStaticChart = function(chartUrl, chartData) {

    $.get(chartUrl, function() {                       
        $('#'+chartData.wrapSpecId).attr('src', chartUrl);                             
    });      
}

Chart.prototype.fnDraw = function(fnStaticChartJSON, fnStaticChartImage) {        

    $.getJSON(fnStaticChartJSON, function(data) { 

        if (data.chartData.length > 0) {    

            $('#chartDiv').append($('#template').jqote(data, '@'));       

            $.each(data.chartData, function(index, chartData) { 

                var pkgLineId = chartData.wrapSpec2.pkgLineId.pkgLineId;             
                var wrapSpecId = chartData.wrapSpecId;
                var startDate = data.startDate;
                var endDate = data.endDate;

                var chartUrl = fnStaticChartImage({
                    pkg_line_id: pkgLineId, 
                    wrap_spec_id: wrapSpecId, 
                    start_date: startDate, 
                    end_date: endDate
                });

                this.fnDrawStaticChart(chartUrl, chartData); //can't do this.  
                new Chart().fnDrawStaticChart(chartUrl, chartData); CAN do this.



            });      
    }); 
}

【问题讨论】:

    标签: javascript function-prototypes


    【解决方案1】:

    这是一个简单的范围界定问题。 this 指向您传递给 $.each 的函数。您必须将旧的 this 引用存储在另一个变量中:

    Chart.prototype.fnDraw = function(fnStaticChartJSON, fnStaticChartImage) {        
        var self = this;
        $.getJSON(fnStaticChartJSON, function(data) { 
    
            if (data.chartData.length > 0) {    
    
                $('#chartDiv').append($('#template').jqote(data, '@'));       
    
                $.each(data.chartData, function(index, chartData) { 
    
                    var pkgLineId = chartData.wrapSpec2.pkgLineId.pkgLineId;             
                    var wrapSpecId = chartData.wrapSpecId;
                    var startDate = data.startDate;
                    var endDate = data.endDate;
    
                    var chartUrl = fnStaticChartImage({
                        pkg_line_id: pkgLineId, 
                        wrap_spec_id: wrapSpecId, 
                        start_date: startDate, 
                        end_date: endDate
                    });
    
                    self.fnDrawStaticChart(chartUrl, chartData);
                    new Chart().fnDrawStaticChart(chartUrl, chartData);
                });      
        }); 
    }
    

    【讨论】:

    • 好酷。那么为什么我不能这样称呼它 this.fnDrawStaticChart() 呢? “this”是指 $.getJSON 中的东西吗?
    • 不,this 始终是指您所在函数的当前范围,在您的情况下是您传递给 $.each() 的函数(索引,chartData)。
    猜你喜欢
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    相关资源
    最近更新 更多