代码之家  ›  专栏  ›  技术社区  ›  John

这是引用JavaScript中对象的安全方法吗?

  •  1
  • John  · 技术社区  · 15 年前

    如果我要定义两个对象mydatastore和mydrawer,就像这样:

    var myDataStore = function(myObjectRef) {
        this.myInternalObject = myObjectRef;
    };
    
    var myDrawer = function(myObjRef) {
        this.myInternalObject = myObjectRef;
    };
    

    如果我要创建一个这样的对象:

    [edit-adjusted object creation to ensure'this'is mapped to myobject,not the global window object]]

    (function(){
      var myObject = window.myObject = function(){
          this.dataStore = new myDataStore(this);
          this.drawer = new myDrawer(this);
      }
     })();
    

    然后myObject.datastore.myInternalObject和myObject.drawer.myInternalObject将只是返回原始“myObject”的指针,而不会占用浏览器中的任何其他内存。对?

    我对实现这样的技术很感兴趣,因为它使对象之间的通信变得容易。

    3 回复  |  直到 15 年前
        1
  •  1
  •   juandopazo    15 年前

    是的,你的假设是正确的。 myInternalObject 将是引用而不是新对象。您可以这样测试它:

    var MyDataStore = function(myObjectRef) {
        this.myInternalObject = myObjectRef;
    };
    
    var data = {
        value: "value"
    };
    var dataStore = new MyDataStore(data);
    data.value = "test";
    console.log(dataStore.myInternalObject);  // logs { value : "test" } instead of { value: "value" }
    
        2
  •  2
  •   Caleb    15 年前

    不。 this 指的是 . 或者如果没有左手边 . 然后是全局对象。

    所以如果你这样做:

    var MyObj = {
       "create": function() {
          var myObject = {
             dataStore = new myDataStore(this);
             drawer = new myDrawer(this);
          }; 
       }
    }; 
    MyObj.create();
    

    将是 MyObj . 如果你这样做:

    var myObject = {
       dataStore = new myDataStore(this);
       drawer = new myDrawer(this);
    }; 
    

    (不在函数中) 将是 window (假设在浏览器中)。

        3
  •  1
  •   Tim Down    15 年前

    不。 myObject.dataStore.myInternalObject myObject.drawer.myInternalObject 都将指向全局对象(映射到 window 在浏览器中),除非在声明 myObject . 换句话说,它将被设置为 this 在您声明的上下文中 我的对象 . 它不会 我的对象 本身。