如何从类函数内部访问对象属性

时间:2012-08-06 03:29:51

标签: javascript class object

我的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;不起作用......我的对象仍然是最后一个数据集,而不是更新的数据集。函数SET,我创建的另一种尝试来设置数据。

ajax没有问题,因为我对ajaxData进行了调试,并且没问题(当我更新时)。

那么,我如何真正从内部函数访问对象属性data

(对不起我的英文......)

4 个答案:

答案 0 :(得分:16)

我很难学到这一点,你必须小心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();
        });
    };
}

答案 1 :(得分:4)

缓存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();
    });
  };
}

答案 2 :(得分: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。您可以使用this.apply()方法将.call()显式设置为其他对象。否则,如果您使用set(ajaxData)调用函数,则this将成为全局对象(window)。

通过在函数外部保留对this的引用(我更喜欢变量名self),您可以在函数内引用它。

答案 3 :(得分: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
*/