簡體   English   中英

Javascript 創建對 object 屬性的引用?

[英]Javascript create reference to an object property?

我了解到在 javascript 中, primitives are passed by value and objects are passed by reference

我有興趣創建某種解決方法,讓我獲得對包含原語的 object 屬性的引用。 例如,我希望能起作用的是:

var someObject = {a: 1, b: 2};
var myRef = someObject.b;
myRef ++;
someObject.b #=> 3

當然,這是行不通的。 我知道你可以創建一個 getter 和 setter function,或者使用一個 object 來引用另一個 object,但我真正想要的是某種解決方法,它允許我定義一個變量作為對屬性的引用另一個 object,到目前為止,這似乎無法完成。

所以,我的問題很簡單:這是否可能,如果可能,如何實現?

原始類型是不可變的,所以不,這是不可能的。 您可以使用對象包裝基本類型,如下所示:

function MyNumber(n) { this.n = n; }
MyNumber.prototype.valueOf = function() { return this.n; }
var someObject = { a: 1, b: new MyNumber(2) };
var myRef = someObject.b;
MyNumber.call(myRef, myRef + 1);
console.log(+someObject.b); // convert to number with +

要么

var someObject = {
    a: { value: 1 },
    b: { value: 2 },
};
var myRef = someObject.b;
my_inc(myRef); // function my_inc (obj) { obj.value++; }
// someObject.b.value == 3

React框架使用非常簡單的模式來封裝值。

function Link(value, requestChange)
{
    this.value = value;
    this.requestChange = requestChange;
}

您可以傳遞對象,可以通過檢查對象的value屬性來訪問當前值,如果要更改它,可以使用新值調用requestChange ,您可以更改該值。 優點是具有實際的“存儲位置”和用於將值與讀取和寫入訪問值分離的邏輯。 請注意,值也可以是復雜對象。

你也可以用閉包來實現類似的東西:

var someObject = {
    a: 1,
    b: 2
};

function property(object, prop) {
    return {
        get value () {
            return object[prop]
        },
        set value (val) {
            object[prop] = val;
        }
    };
}

var ref = property(someObject, "b");
ref.value; // 2
++ref.value; // 3
someObject.b; // 3

這是有效的,因為getter和setter函數可以訪問創建時范圍內的任何綁定( objectprop )。 您現在可以傳遞ref ,將其存儲在數據結構中等。

不,沒有一個很好的方法來做到這一點。

如果您願意,可以使用解決方法。 像使用單個元素數組包裝所有主數據類型的東西:

var someObject = {a: [1], b: [2]};
var myRef = someObject.b;
myRef[0]++;
someObject.b[0]; // 3

但這並不理想,因為你必須使用[0]來一直訪問該屬性。 在某些情況下,它可能很有用,並且單個元素數組的默認toString只是其元素的toString ,因此您可以直接在字符串上下文中使用該屬性:

console.log('My value: ' + someObject.b); // 'My value: 3'

如果你想“鏈接”或“同步”兩個屬性,每個屬性都是不同的 object,你可以這樣做:

var someObject = {
    a: 1,
    b: 2
};
var linkedObject = {
    a:1, 
    b:2
}
function property(object, prop) {
    return {
        get value () {
            return object[prop]
        },
        set value (val) {
            object[prop] = val;
        }
    };
}
var s_prop = 'b'
var o_ref = property(someObject, s_prop);
var tmp = linkedObject[s_prop]; 

Object.defineProperty(
    linkedObject,
    s_prop,
    {

        set: function(value) {
            o_ref.value = value;
        },
        get: function() {
            return o_ref.value
        }
    }
);
linkedObject[s_prop] = tmp 

someObject.b = 333 /// linkedObject.b is also 333 now
console.log(someObject.b) //  333 
console.log(linkedObject.b)// 333

linkedObject.b = {"test": 2}
console.log(someObject.b) //  {test:2}
console.log(linkedObject.b)// {test:2}

someObject.b.test = 3 
console.log(someObject.b) // {test:3}
console.log(linkedObject.b)//{test:3}

我不知道這是多么令人滿意,但如果您可以將所需對象包裝在如下對象中,那么您可以這樣做:

var a = {a:{a:1},b:2};
var b = a.a;
b.a++;
a.a.a //=> 2

這不完全是你要求的,但它會起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM