javascript模块模式返回对象引用
javascript module pattern return object reference?
我的理解是,对象是通过引用传递的。。我已经实现了如下模块模式。
var myModule = (function(){
var obj = {};
return {
obj: obj,
updateObj: function(newObj) {
obj = newObj;
}
}
}())
myModule.obj; // {}
myModule.updateObj({foo:'bar'});
myModule.obj; // still {} :(
我哪里错了?myModule.obj不是对内部obj-var的引用吗?
编辑:最后用这个:
var myModule = (function(){
var public = {
obj: {},
updateObj: function(newObj) {
public.obj = newObj;
}
}
return public;
}())
我哪里错了?
您正在为obj
变量分配一个新引用,但这不是您的console
代码所要查看的内容。它正在查看您返回的对象的obj
属性中的引用。
myModule.obj
不是对内部obj
变量的引用吗?
没有。此:
return {
obj: obj
// ...
}
将对象引用从变量复制到属性,之后变量和属性之间没有链接。
在创建了myModule
之后,在调用updateObj
之前,以下是内存中的内容(省略了一些无关的细节):
++|++|+−>|执行上下文||+||obj:Ref11235|−−−−+|+----+|||++|+对象|||变量"myModule"||+-+-+-+-+|+----+|||目标:参考文献11235|+-+-+-+-||updateObj:Ref88452|−−−−->|函数||+||环境:参考71423 |−−+|[[代码]|++
Ref11235只是该对象引用值的占位符。(类似地,Ref88452是函数的对象引用,Ref71423是updateObj
函数引用的幕后"EnvironmentRecord"对象的对象参考,因此它可以更新该环境的obj
变量。)
调用updateObj
后,您已经更改了myModule
的obj
属性中的引用,但这不会更改obj
变量中的引用:
++|++||+−−−−对象||+−>|执行上下文||+|+----+|||目标:参考文献11235 ||+对象||+−−>>|+----+| foo:"bar"|||变量"myModule"||+|+----+|||目标:参考文献65243|+-+-+-+-||updateObj:Ref88452|−−−−->|函数||+||环境:参考71123 |−−+|[[代码]|++
唯一的变化是myModule.obj
的值,它现在引用了一个新对象。
如果更改updateObj
以更新属性,则改为:
updateObj: function(newObj) {
this.obj = newObj;
}
然后你会看到你期望的结果。(此时,完全取消obj
变量可能是有意义的。)
问题是updateObj
中的obj
没有引用模块中定义的obj
变量。要引用与myModule
中相同的obj
,请使用this
上下文。
this.obj = newObj;
var myModule = (function () {
var obj = {};
return {
obj: obj,
updateObj: function (newObj) {
this.obj = newObj;
}
};
}());
console.log(myModule.obj);
myModule.updateObj({
foo: 'bar'
});
console.log(myModule.obj);
myModule.obj不是对内部obj-var的引用吗?
不,不是。
CCD_ 23创建一个对象并为其指定一个引用作为CCD_ 24的值。
obj: obj
将obj
的值(即引用)复制到另一个对象的obj
属性。
CCD_ 28用对新对象的引用覆盖CCD_ 29的值。这不涉及obj
属性,因此它仍然是对第一个对象的引用。
这个类似于下面的代码:
var a = {}, b=a;
a = {some:1};
alert(b.some);
这不起作用,因为在a={some:1}
行中,您将丢失与b的链接。
希望这会有意义!
内存中有一个对象,并且有该对象的地址。变量obj
包含对象的地址。当您将obj
变量分配给obj
属性时,您将分配地址。然后将obj
变量中的地址覆盖到另一个对象,但obj
属性中的地址仍然相同。
- 如何使用object.assign()从其他对象引用基本对象属性
- 从 javascript 中的对象方法返回一个对象
- 返回 JavaScript 类值而不是对象引用
- Facebook:当发布期望对象引用时显示打开的图形对话框
- Date对象未返回预期年份
- Javascript-如何从字符串/对象引用回调
- 将其用于对象引用
- 如何将对象引用传递到 mootools 中另一个对象的构造函数中
- Javascript:将类/对象引用设置为 NULL,内存中的子对象/类会发生什么
- 在 Jquery 中,我可以存储对象引用并在以后使用它吗?
- 将对象函数传递给请求动画帧时丢失对象引用
- 在 es6 中迭代对象并返回新对象
- 即使对于非空窗体,FormData对象也返回空.对于具有2个输入字段的表单,
- 窗口对象属性返回一个dom节点
- 为什么根据括号的位置来引用窗口或对象?并返回undefined
- 在Angularjs服务中为返回对象引用的http请求提供的数据构建简单的缓存
- 当从包含IFrame的HTA中引用IFrame对象时返回null
- javascript模块模式返回对象引用
- 返回 JavaScript 类值而不是对象引用(在 ES6 中)
- 我如何从javascript中返回的对象引用私有方法