2012-08-27 10 views
8

Próbuję mieć obie zmienne "my_a" i letters.a wskazują na ten sam obiekt.Czy jest możliwe, aby 2 zmienne wskazywały na ten sam obiekt? (javascript)

//i want letters.a to reference (point to) my_a, not be a copy... 
//expected output should be: letters.a = c 
//made variables into Objects.. but didn't help. 

var my_a = new Object('a'); 
var my_b = new Object('b'); 
var letters = {'a': my_a, 'b': my_b}; 

$('#output').append('my_a = ' + my_a + '<br>'); 
$('#output').append('leters.a = ' + letters.a + '<br>'); 

my_a = new Object('c'); 

$('#output').append('my_a = ' + my_a + '<br>'); 
$('#output').append('letters.a = <span style="color:red">' + letters.a + '</span>'); 
​ 

Zobacz ten skrzypce:

http://jsfiddle.net/jCsUq/1/

Ale jak widać przez wyjście, to nie działa.

Wszelkie pomysły? Czy to możliwe z javascript?

Dziękuję.

+0

Cóż, tak naprawdę nie robisz tego, co myślisz, że jesteś. Wskazujesz wewnętrzną zmienną jednego obiektu na wartość innego obiektu. Aby zrobić to, co próbujesz zrobić, jest po prostu głupie w JavaScript. Czy mogę zapytać, jaki jest twój cel końcowy? Być może uda nam się znaleźć lepsze rozwiązanie. – SpYk3HH

+0

@ SpYk3HH Potrzebuję tylko odniesienia do aktualnej "litery". Są tylko dwie "litery". Stary lub nowy. Muszą być przełączane w różnym czasie. litera 1 staje się stara, litera 2 staje się nowa. – Wesley

+0

@Wesley Zaktualizowałem swoją odpowiedź z możliwym podejściem, w zależności od potrzeb twojej przeglądarki. – Pointy

Odpowiedz

5

Odpowiedź na to pytanie brzmi „tak”, ale myślę, że pytanie nie opisuje dokładnie rzecz próbujesz zrobić. To, co chcesz, to dla letters.a odwołanie do zmiennej "my_a", w sensie tego, co można zrobić w C++ za pomocą operatora &. W JavaScript nie jest to możliwe.

Pod stwierdzeniem:

my_a = new Object('c'); 

dajesz "my_a" nową, inną wartość. Tak więc letters.a nadal odnosi się do tego samego, co zrobił, a "my_a" się zmieniło. Nie ma sposobu, aby uczynić właściwość zmiennej lub obiektu "śledzić" inną (w JavaScript).

edit — faktycznie występuje mi się, że można zrobić coś takiego, czego szukasz poprzez zdefiniowanie „getter” do „a” własność „litery”, jedną, która zwraca bieżącą wartość " my_a ". Byłoby wymagają tej funkcji w silniku JavaScript, którego używasz, ale byłoby to wyglądać mniej więcej tak:

var letters = {}; 
Object.defineProperty(letters, "a", { 
    get: function() { return my_a; }, 
    set: function(v) { my_a = v; } 
}); 

IE przed IE9 nie obsługuje niestety. Here's the updated jsfiddle.

+0

Dobre złapanie tutaj – Austin

+0

Jedną z rzeczy, które możesz zrobić, to tworzyć litery i tworzyć proste func do FiFo z nowymi postaciami. Coś w rodzaju 'function fifoArray (myArray, newValue) {myArray.pop(); myArray.unshift (newValue); } 'Wtedy myArray [0] będzie zawsze najnowszym, a myArray [1] zawsze będzie ostatnim – SpYk3HH

3

Można pkt 2 zmienne do tego samego przedmiotu lub wartości w javascript tak:

var a = b = {}; 
// both a and b now reference the same object 

Ponadto, nie ma potrzeby korzystania z konstruktora obiektu, nawiasy klamrowe służą jako konstruktor i zapisać pisać. Czyli tak:

var a = new Object(); 

jest równoznaczne z:

var a = {} 
+0

Czy są jakieś ulepszenia lub korzyści? –

2

Jesteś zdezorientowany przez koncepcję wskaźników. Kiedy przechowujesz obiekt w zmiennej, faktycznie przechowujesz adres tego obiektu w zmiennej.

Moje my_a i letters.a zawierają adres tego samego obiektu. następnie zmienisz my_a, aby zawierał adres nowego obiektu. Ale letters.a nadal zawiera adres pierwszego obiektu!

Tak więc na końcu skryptu, my_a wskazuje na obiekt "c", a litery.a wskazują na obiekt "a".

Jedyny sposób na uzyskanie listów.ai my_a aby wskazać obiekt, który nazywamy 'c', to zrobić

letters.a = my_a 

ponownie, ustawienie letters.a zawierać adres nowego obiektu 'C'.

Nawiasem mówiąc, zmienne posiadające bardziej podstawowy typ (np. Ints, char) faktycznie zawierają wartość samej zmiennej, a nie wskaźnik do rzeczywistych danych.

0

Tak, jest to możliwe.

Byłeś we właściwym kierunku, ale popełniłeś mały błąd. Po zainicjowaniu var letters = {'a': my_a, 'b': my_b}; wstawiłeś obiekt, który my_a wskazywał na w tym momencie.

Zmiana my_a później nie zmieniła się letters, ponieważ zawiera już bezpośredni wskaźnik do Object('a').

0

Tak, jest to bardzo możliwe i jest domyślne. Jednak w twoim kodzie modyfikujesz odniesienie (my_a = new Object ('c');) kiedy chcesz zmodyfikować wartość. Zostałoby to lepiej zilustrowane, gdyby zamiast ciągów były używane tablice, np. my_1 = [23]; my_1 [0] = 8;

0

Dlaczego nie używasz takiego konstruktu:

var letters = {'a': (new Object('a')), 'b': (new Object('b'))}; 

to dużo bardziej czystsze imho.

Powiązane problemy