Javascript 对构造函数中当前对象的引用

Javascript 对构造函数中当前对象的引用,javascript,Javascript,我试图定义一个类,该类在其构造函数中实例化其他对象并将引用传递给自身: var Child = function(m) { var mother = m; return { mother: mother } } var Mother = function() { var children = makeChildren(); return { children: children } function makeChildren() { v

我试图定义一个类,该类在其构造函数中实例化其他对象并将引用传递给自身:

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;
  }
}
var Child=函数(m){
var=m;
返回{
母亲:母亲
}
}
var Mother=function(){
var children=makeChildren();
返回{
儿童:儿童
}
函数makeChildren(){
var children=[];
对于(变量i=0;i<10;i++){

var c=new Child(this);//当您从母对象内调用makeChildren()时,可以尝试传递对母对象的引用,例如:

var Mother = function() {
   var children = makeChildren(this);
}
然后,makeChildren()函数可以接受引用作为参数,您可以使用该引用:

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

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

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

这应该可以在不进一步修改代码的情况下工作

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

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;
  }
}
var-Mother=function(){

var self=this;//Javascript的
this
不是词法。这意味着
makeChildren
获得自己的
this
,而不是您想要的
母亲的
this

将一个普通变量设置为该值,然后改用它

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

但我认为这样做还不够。通过从构造函数返回一个对象,可以忽略
this
。在其中设置一些内容:

this.children = children;
而不是返回一个新对象

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
   }   
};
Mother
对象中的前三行确保
that
的值是
Mother
实例,而不是全局对象。如果没有它们,您将始终必须编写:

var m = new Mother();

自变量只能从母函数内部访问,不是吗?除非你明确地传递了一个引用?@jayp:内部函数可以使用其范围内的所有变量,这包括外部函数的变量。出于某种原因,我认为makeChildren不是一个内部函数,而是一个单独的函数-显然我没有正确阅读。谢谢。如果
makeChildren
是单独的(非内部的)函数
.call
语法将允许它工作。或者您可以将引用作为参数传递。使用magic
这个
变量玩游戏通常会让人失去脚。我喜欢这个解决方案,因为它简单、直接,而且
makeChildren
不需要在特殊的情况下调用设置
this.children=makeChildren()
有效。一般来说,这被认为是一种比从构造函数返回对象更好的模式吗?只是在使用
new
语法进行构造函数时,您可以使用
this
如果您计划拥有一个返回自己的东西的函数,而不需要访问它来继承或访问原型方法,那么您最好将它设置为一个普通的非构造函数函数。(并使名称不大写。对于需要
新的
操作符的事物,约定保留该名称)
var m = Mother();
var m = new Mother();