![](/img/trans.png)
[英]Javascript - how do I stop / delete / remove / kill a new object class instantiation?
[英]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
有什么辦法可以聲明myInstantiation
或myFunc
以便仍然做同樣的事情(例如,實例化對象),但是可以使我更改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在標准之前已經做了自己的事情,但是現在已經棄用,並且只能在幾個瀏覽器中使用)。
我應該指出您的代碼中的一些問題:
您沒有聲明變量,因此成為了Implicit Globals恐怖的犧牲品。
您的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 } );
通過調用給定的函數而不是直接使用myVar
, myVar
的更改應該在myFunc
內部可見。 而且,如果您希望進行簡單的雙向通信,則可以同時使用之前的功能和該新功能,以便從myFunc
獲取/設置myVar
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.