【问题标题】:Storing a pointer in javascript在javascript中存储指针
【发布时间】:2015-06-08 14:37:21
【问题描述】:

是否可以在不使用 javascript 中的持有者对象的情况下保留对象引用? 目前,当一个对象被覆盖时,我有时会丢失对下面 sn-p 中所示的“当前”对象状态的引用;

有没有办法将“指针”放入数组中?

编辑 对于提出的问题:

我拥有的对象是对表单字段的引用。其中一些是文本字段,一些是文本区域,一些是复选框。

我希望在它们是什么类型的直接引用旁边保留一张地图。

基本上是这样的

obj {
   this.text1 = createTextField();
   this.text1.datepicker();
   this.text2 = createTextField();
   this.area1 = createArea();
   this.check = createCheck();
   this.datefields = [this.text1];
   this.checkboxes = [this.check];
}

所以我可以使用 datefields/checkboxes 数组作为检查点来验证字段是/应该针对哪种类型运行。

目前我使用

function datefields() { return [this.text1]; };

但我想知道是否有比在需要检查时实例化一个新数组更好的方法。

我知道有一种方法可以让观察者模仿指针行为,我已经对这些进行了修改并取得了一些不错的结果,我只是好奇是否还有其他我不知道的方法。

function myObject() {
    this.myvalue = null;
    this.arr = [this.myvalue];
}

myObject.prototype.alter = function() {
    this.myvalue = "hello";
}

var x = new myObject();
var elem = document.getElementById('results');

function log(message) {
    elem.appendChild(document.createTextNode(message));
    elem.appendChild(document.createElement('br'));
}

log("x.myvalue = "+x.myvalue);
log("x.arr[0] = "+x.arr[0]);
log("calling alter");
x.alter();
log("x.myvalue = "+x.myvalue);
log("x.arr[0] = "+x.arr[0]);   
<div id="results"></div>

【问题讨论】:

  • 每当根obj改变时,根和引用之间的引用链接都将失效
  • 为简单起见,请使用console.log()
  • @NayukiMinase console.log() 代码 sn-ps,真的吗?
  • 这根本不可能,阅读此stackoverflow.com/questions/10231868/pointers-in-javascript(不要只阅读已接受的答案)
  • 所以您想将myObject.arr[0] 指向myObject.myvalue 并在.myvalue 更改时更新.arr?您可以使用 getter 和 setter 来实现它,例如:jsfiddle.net/xcu7ku2m - 不要将其发布为答案,因为我不清楚它是否是您正在寻找的。​​span>

标签: javascript


【解决方案1】:

简单的回答:只有对象(包括所有子类型)在 JS 中通过引用传递。复制所有其他简单值。

要了解更多细节,我建议阅读You Don't Know JS: Types & Grammer,尤其是第2章中的Value vs Reference部分:

在 JavaScript 中,没有指针,引用的工作方式略有不同。您不能从一个 JS 变量引用另一个变量。这是不可能的。

进一步引用:

简单的值(又名标量原语)总是通过值复制分配/传递:nullundefinedstringnumberboolean 和 ES6 的 symbol

复合值——对象(包括数组和所有装箱的对象包装器——参见第 3 章)和函数——总是在赋值或传递时创建引用的副本。

包含大量示例来说明这些要点。我强烈建议您通读以更好地了解值/引用在 JS 中的工作原理。

【讨论】:

  • 我确切地知道引用是如何工作的以及如何使用它。我只是好奇是否有带有观察者的机制或其他东西来模仿指针行为
【解决方案2】:

Javascript 中没有指针,尽管您可以使用包装对象作弊。这是此类对象的最小实现:

var Wrapper = function (value) {
    this.value = value;
};

Wrapper.prototype.valueOf = function () {
    return this.value;
};

那么你可以用它来代替原来的值:

function myObject() {
    this.myvalue = new Wrapper(null); // wrapper
    this.arr = [this.myvalue];
}

myObject.prototype.alter = function() {
    this.myvalue.value = "hello"; // notice the ".value"
}

您的其余代码无需调整。

【讨论】:

  • 是的,但这正是我不想做的。请参阅我的问题中的第一行 ;-) 感谢您的努力。
  • @MichaelDibbets 确实!抱歉 :-D 无论如何,你不能使用 Javascript 来做到这一点 :-/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多