Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是在JavaScript中引用对象的安全方法吗?_Javascript - Fatal编程技术网

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

这是在JavaScript中引用对象的安全方法吗?,javascript,Javascript,如果我要定义两个对象myDataStore和myDrawer,如下所示: var myDataStore = function(myObjectRef) { this.myInternalObject = myObjectRef; }; var myDrawer = function(myObjRef) { this.myInternalObject = myObjectRef; }; var MyDataStore = function(myObjectRef) {

如果我要定义两个对象myDataStore和myDrawer,如下所示:

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

var myDrawer = function(myObjRef) {
    this.myInternalObject = myObjectRef;
};
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" }
如果我要创建这样一个对象:

[[编辑-调整对象创建以确保“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”的指针,不会占用浏览器中的任何额外内存。是吗


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

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

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

不会
引用
左侧的任何对象,或者如果
没有左侧,则它是全局对象

如果你这样做了:

var MyObj = {
   "create": function() {
      var myObject = {
         dataStore = new myDataStore(this);
         drawer = new myDrawer(this);
      }; 
   }
}; 
MyObj.create();
var myObject = {
   dataStore = new myDataStore(this);
   drawer = new myDrawer(this);
}; 
这将是
MyObj
。如果您这样做:

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

(不在函数中)
将是
窗口
(假设它在浏览器中)。

引用
左侧的任何对象,或者如果
没有左侧,则它是全局对象

如果你这样做了:

var MyObj = {
   "create": function() {
      var myObject = {
         dataStore = new myDataStore(this);
         drawer = new myDrawer(this);
      }; 
   }
}; 
MyObj.create();
var myObject = {
   dataStore = new myDataStore(this);
   drawer = new myDrawer(this);
}; 
这将是
MyObj
。如果您这样做:

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

(不在函数中)
将是
窗口
(假设它在浏览器中)。

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

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

var myDrawer = function(myObjRef) {
    this.myInternalObject = myObjectRef;
};
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" }

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

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

var myDrawer = function(myObjRef) {
    this.myInternalObject = myObjectRef;
};
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" }

啊,是的,当然,让我修改代码示例,以便更准确地回答我的问题。啊,是的,当然,让我修改代码示例,以便更准确地回答我的问题。很抱歉,我真的不应该在创建myObject时犯这样的错误-我的困惑不在于处理“this”的范围,而在于JavaScript是否将在myObject.dataStore和myObject.drawer中创建myObject的附加副本,或者它只是对myObject对象的引用——我认为这是我真的不应该在创建myObject时犯的错误——我的困惑不是处理“this”的范围,而是JavaScript是否会在myObject.dataStore和drawer,或者它只是对myObject对象的引用——我认为它就是这样做的