在javascript中使用内部对象文字之间的函数

时间:2015-12-21 16:26:54

标签: javascript

我的问题是我的js类中有2个内部对象,我试图在其他对象中使用其中一个对象的方法(我在下面尝试做的例子)。我理解为什么由于范围原因这不起作用。我只是想知道是否有办法让它发挥作用。

var Class1 = {

    self : this,
    Obj1 : {

        Obj1Method : function () {
            alert("Do something");
        },
        Obj1Method2 : function () {
            alert("Do something else");
        },

        InnerObj1 : {
            InnerNestObj1Method : function (val) {
                alert(val + 2);
            }
        }
    },

    Class1Method2 : function () {
        this.Obj1.Obj1Method2();
    },

    Obj2 : {

        Obj2Method : function (val2) {
            self.Obj1.InnerObj1.InnerNestObj1Method(val2);
        },

        Obj2Method2 : function () {
            self.Class1Method2();
        }
    }
};

Class1.Obj1.InnerObj1.InnerNestObj1Method(3); //works
Class1.Class1Method2(); //works
Class1.Obj2.Obj2Method2(); //No bueno
Class1.Obj2.Obj2Method(5); //No bueno

2 个答案:

答案 0 :(得分:3)

您可以将self替换为Class1来修复您的示例。 第self : this,行将Class1.self设置为指向全局对象(评估该行时为this)。



var Class1 = {

    self : this,
    Obj1 : {

        Obj1Method : function () {
            alert("Do something");
        },
        Obj1Method2 : function () {
            alert("Do something else");
        },

        InnerObj1 : {
            InnerNestObj1Method : function (val) {
                alert(val + 2);
            }
        }
    },

    Class1Method2 : function () {
        this.Obj1.Obj1Method2();
    },

    Obj2 : {

        Obj2Method : function (val2) {
            Class1.Obj1.InnerObj1.InnerNestObj1Method(val2);
        },

        Obj2Method2 : function () {
            Class1.Class1Method2();
        }
    }
};

Class1.Obj1.InnerObj1.InnerNestObj1Method(3); //works
Class1.Class1Method2(); //works
Class1.Obj2.Obj2Method2(); //bueno
Class1.Obj2.Obj2Method(5); //bueno




执行self: this

时会发生什么
// If this is running in non strict mode, from the global scope, `this` points
// To the global object because there was no function call setting `this`
var Class1 = {
    self : this,
};

您需要了解的是this是由使用this调用函数的人设置的。在上面的示例中,没有调用者,因此运行时将this设置为指向全局对象。

在这里,您可以如何使您的对象更具可重用性并为自己提供对外部对象的引用:



function createClass() {
  var self = {
    Obj1: {

      Obj1Method: function() {
        alert("Do something");
      },
      Obj1Method2: function() {
        alert("Do something else");
      },

      InnerObj1: {
        InnerNestObj1Method: function(val) {
          alert(val + 2);
        }
      }
    },

    Class1Method2: function() {
      self.Obj1.Obj1Method2();
    },

    Obj2: {

      Obj2Method: function(val2) {
        self.Obj1.InnerObj1.InnerNestObj1Method(val2);
      },

      Obj2Method2: function() {
        self.Class1Method2();
      }
    }
  };
  return self;
}

var Class1 = createClass();

Class1.Obj1.InnerObj1.InnerNestObj1Method(3); //works
Class1.Class1Method2(); //works
Class1.Obj2.Obj2Method2(); //works
Class1.Obj2.Obj2Method(5); //works




答案 1 :(得分:0)

您可以使用Classes

执行此操作



"use strict"
class Class1 {
  constructor() {
    this.Obj1 = {
      Obj1Method: function() {
        alert("Do something");
      },
      Obj1Method2: function() {
        alert("Do something else");
      },

      InnerObj1: {
        InnerNestObj1Method: function(val) {
          alert(val + 2);
        }
      }
    };
    
    var self = this;
    this.Obj2 = {
      Obj2Method: function(val2) {
        self.Obj1.InnerObj1.InnerNestObj1Method(val2);
      },

      Obj2Method2: function() {
        self.Class1Method2();
      }
    };
  }

  Class1Method2() {
    this.Obj1.Obj1Method2();
  }

};

var c1 = new Class1();
c1.Obj1.InnerObj1.InnerNestObj1Method(3); //works
c1.Class1Method2(); //works
c1.Obj2.Obj2Method(3); //works
c1.Obj2.Obj2Method2(); //works