【问题标题】:JavaScript array of pointers like in C++JavaScript 指针数组,如 C++
【发布时间】:2011-05-17 08:41:41
【问题描述】:

当我需要通过类似于 С++ 对象指针数组的指针来更新对象时,我在 JavaScript 中遇到了这种情况

我的问题的示例代码:

var foo = new Array();
var bar = function(){ 
    this.test = 1;
    foo.push(this); // push an object (or a copy of object?) but not pointer
};
var barInst = new bar(); // create new instance
// foo[0].test equals 1
barInst.test = 2;
// now barInst.test equals 2 but
// foo[0].test still equals 1 but 2 is needed

那么,我该如何解决呢?我应该使用回调或类似的东西,还是有一种简单的方法可以帮助我避免复制对象而不是将原始指针推入数组?

【问题讨论】:

  • 你不是说barInst.test = 2吗? bar 是构造函数,而不是对象。那就是foo[0] 不等于bar...
  • 哦,对不起。是的,我的意思是 barInst.test 而不是 bar.test
  • 在这种情况下,您的代码应该可以工作。可以?见:jsfiddle.net/p6LQh
  • 哦.. 是的,它可以工作.. 而且我查看了原始来源并发现了一个错误,这不再是问题了。两个代码 sn-ps(原始代码和 davin 的代码)都在工作。非常感谢您的帮助!

标签: javascript arrays pointers object


【解决方案1】:

JS 是按值传递的,所以你原来的赋值是this.test = the value of 1,在我的例子中是this.test = the object pointed to by ptr,所以当我更改ptrthis.test 也会发生变化。

var foo = [],
    ptr = {val: 1},
    bar = function(){ 
       this.test = ptr;
       foo.push(this); // push an object (or a copy of object?) but not pointer
    },
    barInst = new bar(); // create new instance
    // foo[0].test.val equals 1
    ptr.val = 2;
    // foo[0].test.val equals 2

虽然您认为foo.push(this); 相似,但事实并非如此。由于这是一个对象,因此该数组确实会包含指向对象的“原始指针”,就像您想要的那样。您可以简单地证明这一点:

foo[0].test = 3;
// barInst.test === 3

这表明它确实是一个指向被压入数组的对象的指针

【讨论】:

    【解决方案2】:

    "创建对象方法指针"

    Object.defineProperty(Object.prototype,'pointer',{
        value:function(arr, val){
           return eval(
                      "this['"+arr.join("']['")+"']"+
                       ((val!==undefined)?("="+JSON.stringify(val)):"")
                      );
         }
    });
    

    使用前

    var o={a:1,b:{b1:2,b2:3},c:[1,2,3]}, arr=['b','b2']
    o.pointer(arr)  // value 3
    o.pointer(['c',0], "new_value" )
    

    【讨论】:

    • 可能会出现未逃脱的问题'
    猜你喜欢
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    相关资源
    最近更新 更多