簡體   English   中英

如何為對象的新實例提供指針?

[英]How do I give a pointer to a new instantiation of an object?

請參見以下簡化代碼:

myVar= 1;
myFunc = function() {
    return { val : myVar };
};
myInstantiation = new myFunc();
console.log(myInstantiation ); //{val:1}
console.log(myVar); //1
myVar=2;
console.log(myInstantiation );//{val:1}
console.log(myVar); //2

有什么辦法可以聲明myInstantiationmyFunc以便仍然做同樣的事情(例如,實例化對象),但是可以使我更改myVar並使該更改反映在myInstantiation內部?

例如,我希望輸出為

console.log(myInstantiation );//{val:2}
console.log(myVar); //2

不是直接,不是(嗯,可以使用ECMAScript5)。 表達方式

return { val: myVar };

...獲取myVar並將其分配給新對象的val屬性。 val屬性的值與myVar的值之間沒有持久的聯系。

執行所需操作的直接方法是使val為函數而不是屬性:

myVar = 1;
myFunc = function() {
    return {
        val: function() {
            return myVar;
        }
    };
};
myInstantiation = new myFunc();
myVar = 2;
alert(myInstantiation.val()); // alerts "2"

現場例子

如果是一個屬性,它可能與ECMAScript5:您可以定義一個當有人訪問一個對象的屬性被調用函數,使用新的Object.defineProperty功能:

myVar = 1;
myFunc = function() {
    var rv = {};
    Object.defineProperty(rv, "val", {
        get: function() {
            return myVar;
        },
        set: function(newVal) {
            myVar = newVal;
        }
    });
    return rv;
};
myInstantiation = new myFunc();
myVar = 2;
alert(myInstantiation.val); // alerts "2"

實時示例 -在Chrome,Firefox的最新版本或Safari(而不是Opera或到目前為止的任何IE版本)中運行。

它仍然是一個函數調用,暗示着開銷,但是使用myInstantiation的代碼將其視為屬性訪問。 (這很方便,但在某些方面有誤導性。)

Object.defineProperty僅與支持新ECMAScript5功能的JavaScript引擎一起使用,而不是與IE一起使用。 否則,如果沒有顯式的函數調用,就沒有標准的操作方式(Mozilla在標准之前已經做了自己的事情,但是現在已經棄用,並且只能在幾個瀏覽器中使用)。


我應該指出您的代碼中的一些問題:

  1. 您沒有聲明變量,因此成為了Implicit Globals恐怖的犧牲品。

  2. 您的myFunc定義為:

     myFunc = function() { return { val: myVar }; }; 

    ...但是隨后您用new來調用它:

     myInstantiation = new myFunc(); 

    由於您的函數返回一個對象,因此new在那里沒有任何作用,您可以這樣做

     myInstantiation = myFunc(); 

    這是因為new工作方式:它創建一個對象,使用myFunc.prototype的原型初始化該對象,然后使用this對象將myFunc設置為新對象。 如果myFunc不返回任何內容或返回原始類型(或null ),則new表達式的結果是new創建的新對象。 但是,如果myFunc返回一個對象(如你所做的),通過創建新的對象new的扔掉你的對象來代替。 因此, new功能與您的功能無關。

在JavaScript中,某些類型是通過值傳遞的,而其他類型是通過引用傳遞的。 特別是,整數和其他基本類型是按值傳遞的,因此您不能直接檢索指向它們的指針。

但是,如果使用了包裝原始整數的Integer構造函數(我不記得JavaScript具有標准的構造函數),則可以傳遞指向Integer對象的指針。 這將允許通過指針更新值。

自從我使用JavaScript以來已經有一段時間了,所以我不確定下一個想法是否可行。 實例化一個新函數時,該函數將關閉當前作用域中的變量。 這意味着您應該能夠執行以下操作:

myInstantiation = new myFunc(new function(newValue) { myVar = newValue } );

然后可以在myFunc (語法可能有點差,但是我認為這個想法應該可行。就像我說的那樣,我不再真正使用JavaScript)。

編輯

所以,是的,就您的問題而言,最后一部分毫無意義-我的情況倒退了。 但是,您可以改用對偶函數:

myInstantiation = new myFunc(new function() { return myVar } );

通過調用給定的函數而不是直接使用myVarmyVar的更改應該在myFunc內部可見。 而且,如果您希望進行簡單的雙向通信,則可以同時使用之前的功能和該新功能,以便從myFunc獲取/設置myVar

暫無
暫無

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

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