这是在JavaScript中引用对象的安全方法吗?
如果我要定义两个对象myDataStore和myDrawer,如下所示:这是在JavaScript中引用对象的安全方法吗?,javascript,Javascript,如果我要定义两个对象myDataStore和myDrawer,如下所示: var myDataStore = function(myObjectRef) { this.myInternalObject = myObjectRef; }; var myDrawer = function(myObjRef) { this.myInternalObject = myObjectRef; }; var MyDataStore = function(myObjectRef) {
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对象的引用——我认为它就是这样做的