在javascript中存储指针

时间:2015-06-08 14:37:22

标签: javascript

是否可以在不使用javascript中的holder对象的情况下保留对象引用? 目前,当一个对象被覆盖时,我有时会失去对下面代码段中所示的“当前”对象状态的引用;

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

修改 对于提出的问题:

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

我希望在他们所属的直接参考旁边留一张地图。

基本上就是

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>

2 个答案:

答案 0 :(得分:1)

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

有关详细信息,我建议您阅读You Don't Know JS: Types & Grammer,但请参阅第2章中的Value vs Reference部分:

  

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

进一步引述:

  

简单值(又称标量基元)总是由值复制分配/传递:nullundefinedstringnumberboolean,和ES6的symbol

     

复合值 - 对象(包括数组和所有盒装对象包装器 - 请参阅第3章)和函数 - 始终在赋值或传递时创建引用的副本。

有很多例子可以说明这些要点。我强烈建议您阅读以更好地理解值/引用在JS中的工作原理。

答案 1 :(得分:0)

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"
}

其余代码不需要调整。