Javascript 如何通过引用传递或模拟它

Javascript 如何通过引用传递或模拟它,javascript,reference,Javascript,Reference,我有两个假设: var Helper = (function () { return { number: null, init: function (num) { number = num; } } })(); var Helper2 = (function () { return { options: { number: [], },

我有两个假设:

var Helper = (function () {
    return {
        number: null,
        init: function (num) {
            number = num;
        }
    }
})();

var Helper2 = (function () {
    return {
        options: {
            number: [],
        },
        init: function(num){
            this.options.number = num;
        },
        getData: function () {
            return this.options.number;
        }
  }
})();


Helper2.init(Helper.number);
console.log(Helper2.getData());
Helper.init(5);
console.log(Helper2.getData());
我想要的是

Helper2.init(Helper.number);
console.log(Helper2.getData()); // null
Helper.init(5);
console.log(Helper2.getData()); // 5
我得到的是

Helper2.init(Helper.number);
console.log(Helper2.getData()); // null
Helper.init(5);
console.log(Helper2.getData()); // null
如果可以的话,可以采用什么技术使其通过引用

JSBIN:

编辑:在成千上万的人开始采用不同的方式让助手2依赖于助手之前,
Helper
的实际实现是未知的,可能有100种方式实现这个数字,因此Helper2需要内存地址


编辑2:我想我希望开始的路径是知道数组/对象确实是通过引用传递的,我怎样才能将这个基本类型包装成可以通过引用使用的形式呢?首先,为什么它不起作用呢

helper
是一个返回对象的自激活函数。调用
init
时,它会为
Helper
对象设置一个数字

然后在
Helper2
中将一个整数(
Helper.number
)传递给
init
,将对象设置为null。因此,您没有将引用传递给
Helper.number
。只有设置为它的值

您需要将整个对象传递给它并将其读出

例如:

var Helper=(函数(){
返回{
编号:空,
初始化:函数(num){
this.number=num;//添加此
}
}
})();
var Helper2=(函数(){
返回{
选项:{
编号:[],
},
初始化:函数(obj){
this.options=obj;//保存对辅助对象obj的引用。
},
getData:函数(){
if(this.options.number)
{
返回此.options.number;
}
}
}
})();
Helper2.init(Helper)//存储辅助对象
log(Helper2.getData());
Helper.init(5);

log(Helper2.getData())在JavaScript中通过引用传递只能发生在对象上。 在JavaScript中,唯一可以通过值传递的是基本数据类型

如果在第一个对象上将“number:null”更改为嵌套在选项对象中,就像在第二个对象中一样,则可以将该对象的引用传递给另一个对象。诀窍在于,如果您需要通过引用传递来使用对象,而不是基本数据类型。而是将基本数据类型嵌套在对象中并使用对象

我对你的代码做了一点修改,但我认为这对你想要实现的目标是有效的

var Helper=函数(num){
返回{
选项:{
编号:num
},
更新:功能(选项){
this.options=选项;
}
}
};
var Helper2=函数(num){
返回{
选项:{
编号:num,
},
更新:功能(选项){
this.options=选项;
},
getData:函数(){
返回此.options.number;
}
}
};
var tempHelp=new Helper();
var temphalp2=新的Helper2();
tempHelp2.update(tempHelp.options);
tempHelp.options.number=5;

log(tempHelp2.getData())我不认为你能得到你想要的东西。然而,在你的一条评论中,你说:

不幸的是,接口不是javascript中的东西

事实并非如此。是的,没有强类型,如果您说函数需要特定类型的对象,代码的用户可以完全忽略您的建议

但是,您仍然可以创建一个您希望用户从中扩展的接口,以便更好地使用您自己的代码。例如,您可以告诉用户,他们必须从
value
类中
扩展
,该类提供了一种机制来访问
计算属性,该属性将是一个
引用
实例,可以封装原语(解决无法通过引用传递原语的问题)

由于它使用计算属性,因此还可以利用
.value
符号。问题是,
.value
将是一个
参考
,而不是实际值

//可以传递并保存原语的中间类
课堂参考{
构造函数(val){
this.val=val;
}
}
//指示“值”的接口
阶级价值{
构造函数(){
此._值=新参考();
}
获取值(){
返回此值;
}
设定值(v){
这是._value.val=v;
}
}
//实现有价值接口的“具体”类
类ValuableHelper扩展了ValuableHelper{
构造函数(){
超级();
}
}
//类,该类将处理有价值的助手
类助手{
构造函数(n){
此选项={
编号:n
}
}
getData(){
返回此.options.number;
}
设置数据(n){
this.options.number=n;
}
}
//创建我们的实例
const vh=新的ValuableHelper(),
hh=新助手(vh.值);
//做我们的事
log(hh.getData().val);
vh.value=5;
log(hh.getData().val);
hh.设定数据(vh.值);

vh.value=5您拥有的代码的具体内容是什么?当你说有100种方法可以实现这个数字时,这是否意味着当前的模式是,
Helper
总是在
number
类型的对象根上有一个属性?为什么不直接将Helper封装到Helper2中?@zero298是的。它可能在一个名为
.randomNumber
的变量中,在其他人的
Helper
@Jean BaptisteYunès的实现中,我需要一个接口,该接口有一个通用的方法来获得我想要的值,但是没有接口(在js中没有严格的方法来实现)。嗨,欢迎来到这里。很好的答案,我冒昧地把你的答案放在一个代码段中,这样人们就可以看到结果。谢谢你,也谢谢你把它放在一个代码段中。这依赖于Helper提供的某个接口