2013-06-02 38 views
16

tôi có một đối tượng, được truyền vào nhiều hàm khác nhau bên trong một hàm. các chức năng này có thể hoặc không thể thay đổi giá trị của đối tượng, nhưng nếu chúng thay đổi nó, thì tôi muốn nhận được những thay đổi mới nhất trên đối tượng.đối tượng javascript pass như tham chiếu

Sau đây là những gì im cố gắng để làm:

var ob = {text: 'this is me', name: 'john'} 

function (object) { 

    changeObject(object); 
    customObjectChanger(object); 
    callback = function (object) { 
      object.text = 'new text'; 
    } 

    callback(object); 

    // object value here should be object{text: 'new text', name: 'john'};  
} 
+2

Javascript tự động chuyển các đối tượng theo tham chiếu mọi lúc. Bạn đã thử mã trên của bạn để xem nó đã làm những gì bạn muốn? – jcsanyi

+0

không, tôi chưa có. tôi đã đọc nó. chỉ muốn xác nhận ở đây. – Basit

+2

JavaScript không * không * [Chuyển theo tham chiếu] (http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_reference). Tuy nhiên, JavaScript * không tạo bản sao của các đối tượng khi chúng được truyền hoặc gán *. Như vậy, nó là đối tượng * cùng * với một tên khác - các thay đổi được thực hiện cho đối tượng (từ bất kỳ tên nào) ảnh hưởng đến đối tượng đã nói. – user2246674

Trả lời

79

Trong đối tượng JavaScript luôn đi ngang qua sao chép tài liệu tham khảo. Tôi không chắc đó có phải là thuật ngữ chính xác hay không, nhưng một bản sao tham chiếu đến đối tượng sẽ được thông qua.

Điều này có nghĩa là mọi thay đổi được thực hiện đối tượng sẽ hiển thị cho bạn sau khi chức năng được thực hiện xong .

Code:

var obj = { 
 
    a: "hello" 
 
}; 
 

 
function modify(o) { 
 
    o.a += " world"; 
 
} 
 

 
modify(obj); 
 
console.log(obj.a); //prints "hello world"


Có nói rằng, kể từ khi nó chỉ là một bản sao của tài liệu tham khảo đó là thông qua tại, nếu bạn tái gán đối tượng bên trong chức năng của bạn, điều này sẽ không hiển thị bên ngoài chức năng vì nó chỉ là bản sao của tham chiếu bạn đã thay đổi.

Code:

var obj = { 
 
    a: "hello" 
 
}; 
 

 
function modify(o) { 
 
    o = { 
 
    a: "hello world" 
 
    }; 
 
} 
 

 
modify(obj); 
 
console.log(obj.a); //prints just "hello"

+0

http: // en.wikipedia.org/wiki/Evaluation_strategy - Tôi thích "Call By [Object] Sharing" vì nó trực tiếp, tách biệt các mối quan tâm thực hiện và giảm sự mơ hồ với các quy ước cuộc gọi khác. ECMAScript không * không * sử dụng "Tham chiếu" cho mục đích này trong bất kỳ phần nào của đặc tả. (Loại Đặc điểm Tham chiếu không áp dụng cho các cuộc gọi chức năng.) – user2246674

+2

+1 để biết mô tả rõ ràng về những gì khác với thông tin tham chiếu truyền thống. – jcsanyi

+0

@user - thú vị - cảm ơn thông tin. Một trong những ngày này, tôi sẽ có được xung quanh để thực sự đọc spec :) –

3

"Objects" không phải là giá trị trong JavaScript, và không thể được "thông qua".

Tất cả các giá trị mà bạn đang xử lý là tham chiếu (con trỏ đến đối tượng).

Truyền hoặc gán tham chiếu cho một tham chiếu khác trỏ đến cùng một đối tượng. Tất nhiên bạn có thể sửa đổi cùng một đối tượng thông qua tham chiếu khác đó.

+1

Thật vậy - vì vậy một bản sao tham chiếu đến đối tượng là ... "đã thông qua" -_- –

+0

Thực tế đối tượng sẽ không được chuyển, nhưng tham chiếu sẽ và bạn có thể sửa đổi các thuộc tính của nó nếu bạn thay đổi chúng bên trong bộ thu chức năng – Ignacio

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