对象中的对象中的Javascript`this`?

对象中的对象中的Javascript`this`?,javascript,object,this,Javascript,Object,This,很抱歉,文章标题模糊,我无法用英语为这篇文章制定正确的名称 例如,我有这样一个对象: var APP = { a : 1, b : function(){ return this.a; } } 这样,如果我调用console.log(APP.b())则将引用该应用程序,结果将为1 但如何从子对象连接到应用程序? 例如: 这个例子很有效,但直接指向应用程序是个坏主意。例如: APP2 = APP; APP = null; console.log ( APP

很抱歉,文章标题模糊,我无法用英语为这篇文章制定正确的名称

例如,我有这样一个对象:

var APP = {
    a : 1,
    b : function(){
        return this.a;
    }
}
这样,如果我调用
console.log(APP.b())
将引用该应用程序,结果将为
1

但如何从子对象连接到应用程序? 例如:

这个例子很有效,但直接指向应用程序是个坏主意。例如:

APP2 = APP;
APP = null;
console.log ( APP2.b() );  // 1
console.log ( APP2.c.c1() ); // APP is undefined
UPD:

我有一半的决定: 如果我像方法一样声明属性
c

c : function(){
    var self = this;
    return {
        c1: function(){
            return self.b();
        },
        c2: function(){}
    }
}
它可以工作,但我应该调用方法而不是属性(括号太多):


console.log(APP2.c().c1())
而不是
console.log(APP2.c.c1())
您可以创建工厂方法:

var APP = (function(){
   var self;
   return self = {
      a : 1,
      b : function(){
          return this.a; // could be self, only differs in non-context use
      },
      c : {
          c1: function(){
               return self.a;
          }
      }
   };
})();

APP2 = APP;
APP = null;
APP2.b();  // 1
APP2.c.c1(); // 1

其他两种书写方式:

function App() {
    var that = this;
    this.a = 1;
    this.b = function() {
        return this.a();
    };
    this.c = {
        c1: function() {
            return that.a;
        }
    }
}

function App2() {
    var app = {
        a : 1,
        b : function(){
            return this.a;
        },
        c : {
            c1: function(){
                alert(app.a);
            }
        }
    };
    return app;
}

您可以使用更具Java脚本性的方法来实现这一点:

var App = function() {
    var that = this;
    this.a = 1;
    this.b = function(){
        return this.a;
    };
    this.c = {
        c1: function(){
             return that.a;
        }
    }
}

var app1 = new App();

...

我比较慢(但比较独立),你忘了提到,如何实例化一个应用程序:)@mykhal,没有理由不这样做。
var self={…};return self
会更清晰,不是吗?@mykhal,如果这是你的个人喜好,那就去做吧,我觉得没有必要。好吧,从某种角度来看,这个作业只是作业表达式的副作用:)JSLint对这种结构进行了斥责;)具有
var self={…}的版本;return self
更清晰,因为函数末尾的括号更少(犯语法错误的机会更少)
var App = function() {
    var that = this;
    this.a = 1;
    this.b = function(){
        return this.a;
    };
    this.c = {
        c1: function(){
             return that.a;
        }
    }
}

var app1 = new App();

...