JavaScript-массив указателей, как в C ++ - PullRequest
1 голос
/ 17 мая 2011

Я столкнулся с ситуацией в JavaScript, когда мне нужно обновить объект через указатель, аналогично массиву указателей С ++ на объекты

Пример кода для моей проблемы: </p> <pre class="lang-js prettyprint-override"><code>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

Так, как я могу решить это? Должен ли я использовать обратный вызов или что-то в этом роде или есть простой способ помочь мне избежать копирования объекта, вместо того, чтобы помещать необработанный указатель в массив?

Ответы [ 2 ]

4 голосов
/ 17 мая 2011

JS является передачей по значению, поэтому ваше первоначальное назначение было this.test = the value of 1, в моем примере это this.test = the object pointed to by ptr, поэтому при изменении ptr this.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

Что показывает, что это действительно указатель на объект, который был помещен в массив

0 голосов
/ 17 сентября 2015

"метод создания объекта указатель "

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" )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...