【问题标题】:javascript access "this" in function constructorjavascript在函数构造函数中访问“this”
【发布时间】:2015-03-09 11:20:08
【问题描述】:

我正在尝试创建一个函数构造函数:

var obj = function() {
    this.num = 2;
    this.func = function() {
        // need to access the **instance** num variable here
    };
};

var instance = new obj();

我需要从对象的属性(即函数 func)访问实例属性。但它不起作用,因为this 始终是当前函数..

【问题讨论】:

  • 即使你的代码也能正常工作。

标签: javascript function object properties constructor


【解决方案1】:

this 存储在func 可以访问的变量中:

var obj = function() {
    var _this = this;
    _this.num = 2;
    _this.func = function() {
        console.log(_this.num);
    };
};

【讨论】:

  • 有趣的是你也这样做了_this.num_this.func。这是您为了代码的一致性而做的事情吗?因为我只是将它们保留为this,并且只在方法中使用_this
  • @Andy 没错,它纯粹是为了一致性/可维护性。两种方式都没有性能提升
【解决方案2】:

请使用众所周知的方法,将this 存储到单独的字段中:

    var obj = function() {
      self = this;
      self.num = 2;
      self.func = function() {
       alert(self.num);
          // need to access the **instance** num variable here
      };
    };

   var instance = new obj();

【讨论】:

    【解决方案3】:

    这是我用来解决问题的模式:

    var obj = function(){
      var self = this;
      this.num = 2;
      this.func = function() {
        console.info(self.num);
      };
    };
    
    var instance = new obj();
    

    变量 self 现在可以在 obj 的所有函数中访问,并且始终是 obj 本身。

    这也是一样的:

    var obj = function(){
      var self = this;
      self.num = 2;
      self.func = function() {
        console.info(self.num);
      };
    };
    
    var instance = new obj();
    

    【讨论】:

    • 我看到 self 是一个局部变量。我猜它不会被垃圾收集? self 是否只是为每个作用域再次创建,它类似于 C 中的静态变量?
    【解决方案4】:

    您可以使用自定义构造函数,用于创建自定义构造函数,并且可以毫无问题地访问它,试试吧:

    var Obj = function () {
         this.num = 2;
         this.func = function () {
             alert("I have " + this.num);
             return "I have " + this.num;
         };
    };
    
    var instance= new Obj();
    instance.func();//will return and show I have 2

    【讨论】:

      猜你喜欢
      • 2017-05-31
      • 2013-12-15
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      • 2014-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多