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

Javascript 如何从类函数内部访问对象属性,javascript,class,object,Javascript,Class,Object,我的一个Javascript类有时需要用Json“更新”。我一直在做一个函数,在给定id的情况下更新数据数组,但现在我想做的是更封装(函数更新,类内部) 我所做的: function File(data){ this.data = data; this.update = function (callback){ var set = function(ajaxData){ this.data = ajaxDa

我的一个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.pcb文件不工作。。。我的对象仍保留最后一个数据集,而不是更新的数据集。我创建的函数集是另一次设置数据的尝试

在ajax上没有问题,因为我调试了ajaxData,并且还可以(当我更新时)

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


(对不起,我的英语…

这是我辛苦学来的,你必须小心使用
。它总是指当前范围中的
,而不是它包含的对象。每当您在
function(){…}
中包装某个内容时,
这个
将成为一个不同的范围。在您的情况下,将对象复制到局部变量并操作其
.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();
        });
    };
}
试试这个:

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();
        });
    };
}
函数中此
的值取决于该函数的调用方式。例如,当您使用“点”表示法时,
someObj.someMethod()
然后在
someMethod()
中,您将
this
设置为
someObj
。您可以使用
.apply()
.call()
方法将
显式设置为其他对象。否则,如果使用
set(ajaxData)
调用函数,则
将是全局对象(
窗口


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

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

令人惊叹的!工作出色!谢谢!“它始终引用当前范围”-除非它不引用。如果使用
.apply()
.call()
@nnnnnn调用函数,则可以显式地将
设置为您喜欢的任何对象。是的,但我从未使用过或见过它被使用过。这似乎是解决问题的一种非常高级的方法。我不会用
.apply()
.call()
来解决手头的问题(你可以看到我的答案与你的基本相同),但我在其他情况下也用过。我只是对你使用的语言有点挑剔-请注意,
this
指的是一个对象,它与scope不同。虽然我知道“this”指的是新scope中的变化,因此将“this”复制到“thing”中是可行的,但如果我的新“this”在新scope中发生了变化,我的旧“this”应该仍然可以访问,因为它在“旧”的范围内。所以我不能用“this”来指代旧的“this”,但我相信最初的问题是“我怎样才能指代‘old’this”?如果这是一个从另一个类继承的类,我可能会使用super.memberName。所以问题是,我能在不创建副本的情况下访问更高级别的成员吗?解析“this”的值取决于调用函数的方式,该函数包含使用它的任何代码。查看。+1。很高兴看到其他人使用
self
来反映变量实际上是对self的引用,而不是常见但(在我看来)可怕的
,它听起来总是应该引用其他对象。或者,为了向HTML中的某个孩子道歉,
thing
,这其实没有任何意义……我主要使用
self
,因为它在大多数编辑器中被突出显示为关键字,更容易跟踪,但我同意
更常见,但语义更少。@nnnnnn我认为这并不重要;您只需在使用它的范围内跟踪变量。然而,
self
肯定比
东西
好,我同意。
 (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
*/