2012-08-06 99 views
3

有時候,我的JavaScript中的某個類需要使用Json「更新」。我總是做了一個函數,它更新了數組的數組,給定一個id,但是現在我想要做更多的封裝(函數更新,在類中)。如何從類函數內部訪問對象屬性

我做了什麼:

function File(data){ 
     this.data = data; 

     this.update = function (callback){ 
      var set = function(ajaxData){ 
       this.data = ajaxData.PcbFile; 
      } 
      getPcbFile(data.id, function(ajaxData){ 
       set(ajaxData); 
       callback(); 
      }); 
     }; 
    } 

但是,this.data = ajaxData.PcbFile; doesen't工作......我的目標仍然與去年的數據集,而不是更新的一個。函數SET,我創建的另一個嘗試來設置數據。

ajax沒有問題,因爲我打了個ajaxData,沒關係(當我更新時)。

那麼,我如何真的從內部函數訪問對象屬性data

(對不起,我的英語...)

+0

的價值,「這」解析爲**取決於你調用函數的方式**包含使用它的任何代碼。查看[MDN docs for this](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/this)。 – Alexander 2012-08-06 03:38:52

回答

12

我這裏學到了艱辛的道路,你必須要小心this。它總是指當前作用域中的this,而不是它包含的對象。每當你在function() { ... }中包裝某些東西時,this就成爲不同的範圍。在你的情況下,將對象複製到局部變量,並操縱它的屬性.data屬性。

function File(data){ 
    this.data = data; 
    var file = this; //call the variable whatever you want 
    this.update = function (callback){ 
     var set = function(ajaxData){ 
      file.data = ajaxData.PcbFile; 
     } 
     getPcbFile(data.id, function(ajaxData){ 
      set(ajaxData); 
      callback(); 
     }); 
    }; 
} 
+0

太棒了!完美工作!非常感謝! – 2012-08-06 03:35:56

+0

_「它總是指當前的範圍」_ - 除非沒有。如果你使用'.apply()'或'.call()'調用一個函數,你可以明確地將'this'設置爲你喜歡的任何對象。 – nnnnnn 2012-08-06 03:42:00

+0

@nnnnnn是的,但我從來沒有用過或曾經見過它使用過。這似乎是解決問題的一種奇特先進的方式。 – Polyov 2012-08-06 04:29:52

1

試試這個:

function File(data){ 
    this.data = data; 

    var self = this; 

    this.update = function (callback){ 
     var set = function(ajaxData){ 
      self.data = ajaxData.PcbFile; 
     } 
     getPcbFile(data.id, function(ajaxData){ 
      set(ajaxData); 
      callback(); 
     }); 
    }; 
} 

在函數內的this值取決於函數是如何被調用。例如,當你使用「點」符號時,someObj.someMethod()然後在someMethod()內,你會有this設置爲someObj。您可以使用.apply().call()方法將this明確設置爲某個其他對象。否則,如果您調用的函數與set(ajaxData)那麼this將是全局對象(window)。

通過在函數之外保留對this的引用(我傾向於爲此目的使用變量名self),您可以在函數內引用它。

3

緩存this所以你可以參考它在同樣的背景下別的地方:

function File(data){ 

    var self = this; 

    self.data = data; 

    self.update = function (callback){ 
    var set = function(ajaxData){ 
     self.data = ajaxData.PcbFile; 
    } 
    getPcbFile(data.id, function(ajaxData){ 
     set(ajaxData); 
     callback(); 
    }); 
    }; 
} 
+1

+1。很高興看到其他人使用'self'來反映變量實際上是對自我的引用,而不是常見但是(在我看來)可怕的'that',它總是聽起來像它應該引用某個其他對象。或者,對SomekidwithHTML道歉​​,「thing」,其實並不意味着什麼... – nnnnnn 2012-08-06 03:45:13

+0

我主要使用'self',因爲它在大多數編輯器中被突出顯示爲關鍵字,更容易跟蹤,但我同意'that '更常見,但語義更少。 – elclanrs 2012-08-06 03:48:44

+0

@nnnnnn我認爲這不重要;你只需要跟蹤你使用的範圍內的變量。然而,'self'肯定比'thing'好,我同意。 – Polyov 2012-08-06 04:32:04

0
(function(){ 
    var accessible = { 
    prop1: 'blabla', 
    verify: function(){ 
     console.log(this.prop1); 
     return this; 
    }, 
    deepAccess: function(){ 
     return function(){ 
     accessible.prop1 = 'bloblo'; 
     return function(){ 
      console.log("Deep access ", accessible.prop1); 
     } 
     } 
    }, 
    insideFunction: function(){ 
     //here you can use both 'this' or 'accessible' 
        this.prop1 = 'bleble'; 
        return this; 
     }, 
     prop2: 3.1415 
    }; 
    return accessible; 
})().verify().insideFunction().verify().deepAccess()()(); 

/* console shows: 
blabla 
bleble 
Deep access bloblo 
*/ 
相關問題