Javascript Правильная ссылка на ценности - PullRequest
1 голос
/ 03 сентября 2011

У меня есть глобальная переменная, которая позже обновляется в моей программе, и предыдущий набор переменных, в котором эта глобальная переменная использует исходное ссылочное значение.

Чтобы проиллюстрировать,

var testVar = 1;

var hash = { 
    test : { 
        testGetVar : {opacity: testVar},
        testGetVarFn : function(){ return {opacity: testVar}; }
    }
}

testVar = 2;
console.log(hash.test.testGetVar.opacity); // returns 1
console.log(hash.test.testGetVarFn().opacity); //returns 2

Кто-нибудь объяснит, как это сделать?Скажем, если бы у меня было 10 объектов в хэше, использующих testVar, пришлось бы мне писать fn, чтобы получить обновленное значение?

РЕДАКТИРОВАТЬ: я изменил некоторые требования и привел пример для конкретных целей.

Вот методы getter / setter, но они не работают.

var testVar = new Field("123");

function Field(val){
        this.value = val;
}
Field.prototype = {
        get value(){
             return this._value;
    },
        set value(val){
             this._value = val;
    }
};

var hash = { 
    test : { 
        testGetVar : {opacity: testVar.value} ,
        testGetVarFn : function(){ return testVar.value; }
    }
}

testVar.value = "abc";
console.log(hash.test.testGetVar.opacity); // returns 123
console.log(hash.test.testGetVarFn()); //returns abc

Я предполагаю, что поскольку метод get вызывается при создании хэша, он хранит ссылку на это значение в то время., таким образом, никогда не вернет обновленное значение

Ответы [ 3 ]

2 голосов
/ 03 сентября 2011

Я думаю, вы спрашиваете, как скопировать ссылку на целое число. Javascript не поддерживает указатели, поэтому я полагаю, что это может быть сделано только в замыкании, таком как функция в вашем примере. Обратите внимание, что объекты по умолчанию передаются по ссылке.

Здесь есть хорошее описание правил по значению / по ссылке при передаче аргументов:

http://docstore.mik.ua/orelly/web/jscript/ch09_03.html

1 голос
/ 03 сентября 2011

Вы можете превратить testVar в объект, потому что объекты передаются по ссылке в js, поэтому вам не нужно вызывать функцию для получения последнего значения:

var testVar = {'value':123};

var hash = { 
    test : { 
        testGetVar : testVar,
        testGetVarFn : function(){ return testVar; }
    }
}

testVar.value='abc';
console.log(hash.test.testGetVar.value); // returns 123 (not anymore: returns "abc" now)
console.log(hash.test.testGetVarFn().value); //returns abc
1 голос
/ 03 сентября 2011
var a = "Hello",
    b = a;

a = "Goodbye";

console.log(b); // "Hello"

Поскольку вы вызываете функцию, она будет искать последнюю версию testVar.Свойству testGetVar присваивается значение, которое останется неизменным, если не будет изменено позже в программе.Так что да, вам придется либо явно обновить значение hash.test.testGetVar, либо просто вызвать функцию testGetVarFn.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...