传递给构造函数的函数是否可以访问构造函数的其他属性?

时间:2013-01-10 16:01:23

标签: javascript oop constructor

通常,调用this会起作用;但我在另一个上下文中调用该方法,因此this引用该上下文而不是“父”对象。

以下是代码:

var someConfig = {
  things: [
    {
      attr1: 'foo',
      attr2: 'bar',
      action: function() {
        console.log(this);
      }
    }
  ]
}

function Constructor(config) {
  var self = this;
  self.name = 'test';
  self.things = config.things;

  $.each(self.things, function(i, thing) {
    thing.action();
  });
    }

var obj = new Constructor(someConfig);
console.log(obj);

Here's a jsfiddle。目标是使控制台中的两个对象相同,但this方法上下文中的action返回action所属的原始对象,而不是构造

我唯一能想到的就是将self传递给action,但我认为还有更好的方法。

3 个答案:

答案 0 :(得分:3)

首先,关于代码的几点意见。您的配置属性为uniqueAction,稍后您将其称为config.action。当您致电obj.action时,您需要将其称为以下功能:obj.action();

考虑到这一点,以下似乎可以满足您的需求......

var config = {
  action: function() {
    console.log(this.name);//<- IMPORTANT PART
  }
}

function Constructor(config) {
  var self = this;
  self.name = 'test';
  self.action = config.action;
}

var obj = new Constructor(config)
obj.action();

请注意,console.log来电现在使用this.name代替self.name

Here is a working example

答案 1 :(得分:1)

  

传递给构造函数的函数是否可以访问构造函数的其他属性?

是的,但前提是您将该对象传递给该函数(或隐式使用this keyword)。

您尝试的是从构造函数外部声明的函数访问本地self变量,这是不可能的。

所以只需使用

{
  action: function() {
    console.log(this.name);
//              ^^^^
  }
}

在致电obj.action()时,this会指向该实例。

答案 2 :(得分:1)

我看到的唯一方法是在调用thing之前将'构造函数'添加到配置action

查看this Fiddle,它已经分拆出来了。 我改变了两件事:

首先,action函数不再引用this,而是引用parent的属性this

  action: function() {
    console.log(this.parent);
//                  ^^^^^^^
  }

其次,每个thing对象都会收到一个parent属性,该属性引用self

  $.each(self.things, function(i, thing) {
    thing.parent = self;
    thing.action();
  });