8

我的 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

4 回答 4

22

我很难学到这一点,你必须小心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();
        });
    };
}
于 2012-08-06T03:34:12.543 回答
7

缓存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();
    });
  };
}
于 2012-08-06T03:34:40.287 回答
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. 您可以使用or方法显式设置this为其他对象。否则,如果你调用一个函数,那么将是全局对象()。.apply().call()set(ajaxData)thiswindow

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

于 2012-08-06T03:34:38.447 回答
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
*/
于 2016-07-03T13:35:21.337 回答