在对象中的Javascript`the`?

时间:2011-07-29 12:45:25

标签: javascript object this

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

例如我有这样一个对象:

var APP = {
    a : 1,
    b : function(){
        return this.a;
    }
}

通过这种方式,如果我拨打console.log ( APP.b() )而不是this将引用APP,结果将是1

但如何从子对象连接到APP? 例如:

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

console.log ( APP.c.c1() ) // 1

此示例有效,但直接指向APP是个坏主意。例如:

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() )

3 个答案:

答案 0 :(得分:3)

您可以创建工厂方法:

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

答案 1 :(得分:2)

另外两种写作方式:

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;
}

答案 2 :(得分:1)

你可以使用更多javascriptous方式来做到这一点:

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();

...