2012-12-04 81 views
0

錯誤:無法將undefined轉換爲對象:this.page[1]=100;。它已經被定義,最新的錯誤? enter image description here無法將未定義的對象轉換爲對象?

var sheepclass ; 
(function($) { 
    sheepclass = function(handler){ 
     var $div = $('div');    
     this.handler = $.extend({ 
      'sizes': 'thin', 
      'eat': 'grass', 
      'color': 'white', 
      'page':[], 
      myalert: function() { 
       myconsole(); 
       function myconsole() { 
        this.page[0] = 100; 
        console.log(this.page[0]); 
       } 
      }, 
      myalert2: function() { 
       this.myalert(); 
      } 
     },handler); 
    } 
})(jQuery); 

$(document).ready(function(){ 
    var blacksheep = new sheepclass({'color':'black'}); 
    blacksheep.handler.myalert2(); 
}) 
+0

爲什麼你需要將它包裝在一個文件準備好處理程序中?您的代碼涉及零DOM操作。這麼多代碼在這裏聞起來。 –

+0

瞭解'this'的範圍的經典問題' –

+0

'myalert'部分看起來很狡猾。 爲什麼要在那裏添加一個執行函數的函數,然後初始化該函數? – Cerbrus

回答

0

做出that變量this

var sheepclass ; 
    (function($) { 
     sheepclass = function(handler){ 
      var $div = $('div');    
      this.handler = $.extend({ 
       'sizes': 'thin', 
       'eat': 'grass', 
       'color': 'white', 
       'page':[200,300], 
       myalert: function() { 
        var that = this; 
        myconsole(); 
        function myconsole() { 
         that.page = that.page || [] 
         that.page[0] = 100; 
         console.log(that.page[0]); 
        } 
       }, 
       myalert2: function() { 
        this.myalert(); 
       } 
      },handler); 
     } 
    })(jQuery); 

    $(document).ready(function(){ 
     var blacksheep = new sheepclass({'color':'black'}); 
     blacksheep.handler.myalert2(); 
    }) 
+0

是的,這很好 – FatDogMark

1

試試這個,通過使用that輔助變數

var sheepclass ; 
(function($) { 
    sheepclass = function(handler){ 
     var $div = $('div'); 
     var that = this; 
     this.handler = $.extend({ 
      'sizes': 'thin', 
      'eat': 'grass', 
      'color': 'white', 
      'page':[], 
      myalert: function() { 
       myconsole(); 
       function myconsole() { 
        that.handler.page[0] = 100; 
        console.log(that.handler.page[0]); 
       } 
      }, 
      myalert2: function() { 
       this.myalert(); 
      } 
     },handler); 
    } 
})(jQuery); 

$(document).ready(function(){ 
    var blacksheep = new sheepclass({'color':'black'}); 
    blacksheep.handler.myalert2(); 
}) 
+0

你不需要在那裏有閉包變量。你可以在'myalert'中使用'this'。 –

1

裏面myconsolethis不等於你的對象傳遞上下文,而是指Window代替。因此this.pageundefined - 您索引到page的值並沒有區別。

你要電話更改爲:

myconsole.call(this); 
+0

是的,它的工作,但奇怪的,那麼我已經改變了所有我的功能成爲* .call(這)...我有很多功能..爲什麼要使用這些奇怪的方法。它變得奇怪 – FatDogMark

+1

@FatDogMark:目前還不清楚爲什麼你有很多嵌套函數。當然,你可以將'this'捕獲到另一個變量(例如'that')中並且寫入'that.page'而不是'this.page',但是這仍然意味着你必須找到對'this'的所有引用並且改變它們到'那個'。沒有更簡單的方法來做你正在做的事情,這意味着你正在做的不是一個好主意。 – Jon

0

Becouse 「本」 是指myconsole功能。

試試這個:

var sheepclass ; 
(function($) { 
    sheepclass = function(handler){ 
     var $div = $('div');  
     **var page = this.page;** 
     this.handler = $.extend({ 
      'sizes': 'thin', 
      'eat': 'grass', 
      'color': 'white', 
      'page':[], 
      myalert: function() { 
       myconsole(); 
       function myconsole() { 
        **page**[0] = 100; 
        console.log(**page**[0]); 
       } 
      }, 
      myalert2: function() { 
       this.myalert(); 
      } 
     },handler); 
    } 
})(jQuery); 
+0

星號是怎麼回事? –

+0

似乎沒有工作.. – FatDogMark

+0

星號是大膽的風格,對不起。 – ilCrosta

1

很多這樣的代碼似乎是沒有意義的。 document.ready處理程序是不必要的,因爲沒有DOM操作,因爲是IIFE。您的代碼可以縮減爲:

var sheepclass = function(handler){ 
    this.handler = $.extend({ 
     'sizes': 'thin', 
     'eat': 'grass', 
     'color': 'white', 
     'page':[], 
     myalert: function() { 
      var context = this; 
      function myconsole() { 
       context.page[0] = 100; 
       console.log(context.page[0]); 
      } 
      myconsole(); 
     } 
    },handler); 
} 

var blacksheep = new sheepclass({'color':'black'}); 
blacksheep.handler.myalert(); 

請注意,擁有一個除了調用另一個方法什麼都不做的方法是不必要的。