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

时间:2010-06-01 15:03:41

标签: javascript

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

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

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

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

[[编辑 - 调整对象创建以确保'this'映射到myObject,而不是全局窗口对象]]

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

然后myObject.dataStore.myInternalObject和myObject.drawer.myInternalObject只是指向原始'myObject'的指针 - 不占用浏览器中的任何额外内存。是

我对实现这样的技术感兴趣 - 因为它使对象很容易相互通信。

3 个答案:

答案 0 :(得分:2)

不。 this指的是.左侧的任何内容,或者如果.没有左侧,那么它就是全局对象。

所以如果你这样做了:

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

this将是MyObj。如果你这样做了:

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

是的,你的假设是正确的。 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" }