如何从类函数内部访问对象属性[重复]

Posted

技术标签:

【中文标题】如何从类函数内部访问对象属性[重复]【英文标题】:How to access object property from inside class function [duplicate] 【发布时间】:2012-08-03 01:36:41 【问题描述】:

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

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

【问题讨论】:

"this" 解析为的值取决于调用函数的方式,该函数包含使用它的任何代码。查看MDN docs for this。 【参考方案1】:

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

【讨论】:

太棒了!工作完美!非常感谢! “它总是引用当前范围” - 除非它没有。如果您使用.apply().call() 调用函数,则可以将this 显式设置为您喜欢的任何对象。 @nnnnnn 是的,但我从未使用过或见过它使用过。这似乎是解决问题的一种非常先进的方法。 好吧,我不会使用.apply().call() 来解决手头的问题(您可以看到我的答案与您的答案基本相同),但我已将它们用于其他情况。我只是对您使用的语言很挑剔 - 请注意,this 指的是一个对象,它与范围不同。 虽然我知道“this”是指新范围内的更改,因此将“this”复制到“thing”中是可行的,但如果我的新“this”在新范围内发生了变化,我的旧的“this”应该仍然可以访问,因为它在“旧的”this 的范围内。所以我不能用“this”来引用旧的“this”,但我相信最初的问题是“我怎样才能引用'旧'这个”?如果这是一个从另一个类继承的类,我可能会使用 super.memberName。所以问题是,我可以在不创建副本的情况下访问我的更高级别的成员吗?【参考方案2】:

试试这个:

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。很高兴看到其他人使用self 来反映该变量实际上是对自我的引用,而不是常见但(在我看来)可怕的that,听起来它总是应该引用一些other 对象。或者,向 Somekidwithhtml 道歉,thing,这实际上并没有任何意义...... 我主要使用self,因为它在大多数编辑器中被突出显示为关键字,更容易跟踪,但我同意that 更常见但语义更少。 @nnnnnn 我认为这并不重要;你只需要在你使用它的范围内跟踪变量。但是,self 肯定比thing 好,我同意。【参考方案4】:
 (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
*/

【讨论】:

以上是关于如何从类函数内部访问对象属性[重复]的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式加载时无法从类函数内部访问 jQuery UI

从类内部获取模板[重复]

Python面向对象-方法

浅谈面向对象之封装继承多态!如何使用内部类模拟多继承

Python的面向对象3

为啥即使从类内部获取成员函数指针值也需要类名限定?