在构造函数中引用当前对象

时间:2011-09-30 12:54:01

标签: javascript

我正在尝试定义一个类,在其构造函数中实例化其他对象并向它们传递对自身的引用:

var Child = function(m) {
  var mother = m;

  return {
    mother: mother
  }
}

var Mother = function() {
  var children = makeChildren();

  return {
    children: children
  }

  function makeChildren() {
    var children = [];
    for (var i = 0; i < 10; i++) {
      var c = new Child(this);      // <--- 'this' is an empty object here
      children.push(c)
    }
    return children;
  }
}

这不起作用,并且Child实例最终在mother属性中有一个空对象。这样做的正确方法是什么?

4 个答案:

答案 0 :(得分:4)

Javascript的this不是词汇。这意味着makeChildren获取了拥有 this,而不是获得您想要的Mother this

为此设置一个普通变量并改为使用它。

var that = this;
function makeChildren(){
     blabla = that;
}

我不认为这样做是不够的。通过从构造函数返回一个对象,您忽略this。把事情搞定:

this.children = children;

而不是返回一个新对象。

答案 1 :(得分:1)

当您从母对象中调用makeChildren()时,您可以尝试传递对母对象的引用,这样的事情可能是:

var Mother = function() {
   var children = makeChildren(this);
}

然后makeChildren()函数可以接受引用作为参数,您可以使用它:

function makeChildren(ref)
var c = new Child(ref);

不知道这是否有效,但值得一试。

答案 2 :(得分:1)

嵌套函数不会从其父级继承this,因此this中的makeChildren()与母版构造函数中的this不同,除非您明确设置它在调用makeChildren()

var children = makeChildren.call(this);

这应该无需对代码进行任何进一步更改即可。看看more detail about .call()的MDN。

或者,您可以保存对this的引用,并将其传递给函数:

var Mother = function() {
  var self = this; // <-- new variable

  var children = makeChildren();

  return {
    children: children
  }

  function makeChildren() {
    var children = [];
    for (var i = 0; i < 10; i++) {
      var c = new Child(self);      // <--- change 'this' to 'self'
      children.push(c)
    }
    return children;
  }
}

嵌套函数可以访问函数中的局部变量。

答案 3 :(得分:0)

var Child = function(m) {
    var mother = m;

    return {
        mother: mother
    }
};

var Mother = function() {
    if (!(this instanceof Mother)) {
        return new Mother();
    }

    var that = this;

    var makeChildren = function() {

        var children = [];
        for (var i = 0; i < 10; i++) {
            var c = new Child(that); // <--- 'that' is the reference to Mother
            children.push(c)
        }

        return children;
   };

   var children = makeChildren();

   return {
       children: children
   }   
};

然后做:

var m = Mother();

Mother对象中的前三行确保that的值是Mother实例,而不是全局对象。没有他们,你总是要写:

var m = new Mother();