2012-08-27 30 views
8

Tôi đang cố gắng để có cả hai biến "my_a" và letters.a trỏ đến cùng một đối tượng.Có thể có 2 biến trỏ đến cùng một đối tượng không? (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>'); 
​ 

Xem fiddle này:

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

Nhưng như bạn có thể nhìn thấy bằng cách đầu ra, điều này không làm việc.

Bất kỳ ý tưởng nào? Điều này có thể với javascript?

Cảm ơn bạn.

+0

Vâng, bạn không thực sự làm những gì bạn nghĩ là của bạn. Bạn đang trỏ biến bên trong của một đối tượng vào giá trị của đối tượng khác. Để làm những gì bạn đang cố gắng làm mặc dù chỉ là ngớ ngẩn trong JavaScript. Tôi có thể hỏi mục tiêu cuối cùng của bạn là gì không? Có lẽ chúng ta có thể tìm ra giải pháp tốt hơn. – SpYk3HH

+0

@ SpYk3HH Tôi chỉ cần tham chiếu đến "chữ" hiện tại. Chỉ có hai chữ cái. Cũ hay mới. Họ cần phải được chuyển sang các thời điểm khác nhau. letter1 trở thành cũ, letter2 trở thành mới. – Wesley

+0

@Wesley Tôi đã cập nhật câu trả lời của mình bằng cách tiếp cận có thể, tùy thuộc vào nhu cầu hỗ trợ trình duyệt của bạn. – Pointy

Trả lời

5

Câu trả lời cho câu hỏi của bạn là "có", nhưng tôi nghĩ rằng câu hỏi của bạn không mô tả chính xác điều bạn đang cố gắng làm. Điều bạn muốn là dành cho letters.a để tham chiếu đến biến "my_a", theo ý nghĩa của những gì người ta có thể làm trong C++ với toán tử &. Điều đó là không thể trong JavaScript.

Đồng tuyên bố:

my_a = new Object('c'); 

bạn đang đem lại cho "my_a" một giá trị mới, khác nhau. Vì vậy, letters.a vẫn đề cập đến cùng một điều nó đã làm, trong khi "my_a" đã thay đổi. Không có cách nào để biến một thuộc tính biến hoặc đối tượng "theo dõi" một biến khác (trong JavaScript).

chỉnh sửa — thực sự nó xảy ra với tôi rằng bạn có thể làm một cái gì đó giống như những gì bạn đang tìm kiếm bằng cách định nghĩa một "getter" cho "một" tài sản của "chữ", một trong đó trả về giá trị hiện tại của " my_a ". Nó muốn yêu cầu tính năng trong công cụ JavaScript bạn đang sử dụng, nhưng nó muốn giống như thế:

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

IE trước khi IE9 không hỗ trợ mà không may. Here's the updated jsfiddle.

+0

Tốt bắt tại đây – Austin

+0

Một điều khác bạn có thể làm là tạo một chữ cái Array và viết một func đơn giản để FiFo mảng với các ký tự mới. Một cái gì đó như 'function fifoArray (myArray, newValue) {myArray.pop(); myArray.unshift (newValue); } 'Sau đó myArray [0] sẽ luôn là mới nhất và myArray [1] sẽ luôn là – SpYk3HH

3

Bạn có thể chỉ 2 biến đến đối tượng hoặc cùng giá trị trong javascript như sau:

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

Ngoài ra, không có nhu cầu sử dụng các nhà xây dựng đối tượng, dấu ngoặc nhọn đóng vai trò là các nhà xây dựng và tiết kiệm gõ. Ví dụ này:

var a = new Object(); 

Tương đương với:

var a = {} 
+0

Có bất kỳ cải tiến hoặc lợi ích nào để thực hiện việc này không? –

2

Bạn đang bối rối bởi khái niệm về con trỏ. Khi bạn lưu trữ một đối tượng trong một biến, bạn thực sự lưu trữ địa chỉ của đối tượng đó trong biến đó.

Vì vậy, my_a và letters.a đều chứa địa chỉ của cùng một đối tượng. sau đó bạn thay đổi my_a để chứa địa chỉ của một đối tượng mới. Nhưng letters.a vẫn chứa địa chỉ của đối tượng đầu tiên!

Vì vậy, ở cuối tập lệnh, bạn có my_a trỏ tới đối tượng 'c' và các chữ cái.a trỏ đến đối tượng 'a'.

Cách duy nhất để nhận thư.a và my_a trỏ tới đối tượng bạn gọi là 'c', là để làm

letters.a = my_a 

một lần nữa, đặt chữ cái.a để chứa địa chỉ của đối tượng 'c' mới.

Bằng cách này, các biến chứa loại cơ bản hơn (như int, char) thực sự chứa giá trị của biến đó, không phải là con trỏ đến dữ liệu thực.

0

Có, có thể.

Bạn đã đi đúng hướng, nhưng đã phạm một sai lầm nhỏ. Khi bạn khởi tạo var letters = {'a': my_a, 'b': my_b};, bạn đã chèn đối tượng mà my_a chỉ vào tại thời điểm đó.

Thay đổi my_a sau đó không thay đổi letters, vì nó đã có con trỏ trực tiếp đến Object('a').

0

Có, nó rất có thể và là mặc định. Tuy nhiên, trong mã của bạn, bạn đang sửa đổi tham chiếu (my_a = new Object ('c');) khi bạn muốn thay đổi giá trị. Điều này sẽ được minh họa rõ ràng hơn nếu bạn đã sử dụng mảng thay vì chuỗi, ví dụ: my_1 = [23]; my_1 [0] = 8;

0

Tại sao bạn không sử dụng một cấu trúc như:

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

Đó là nhiều hơn nữa IMHO sạch hơn.

Các vấn đề liên quan