簡體   English   中英

如果分配給它的新值滿足 javascript 中的預定義條件,我如何創建一個只能更改其值的變量?

[英]How can I create a variable that can only change its value if the new value to be assigned to it meets a predefined condition in javascript?

假設您有一個名為window.whatever全局變量 如果要存儲的新值不滿足某些條件,是否可以阻止任何人更改其類型和值?

例如,如果我的變量不是以“https://”開頭,我不希望它被更改。

在這種情況下, window.whatever = "Hello"window.whatever = 15會拋出錯誤,但window.whatever = "https://example.com/"會正常工作。

也許Object.defineProperty會修復它,但我不知道如何。

Object.defineProperty(window, 'whatever', {
  writable: true, //here I want to add a sort of condition
});

我試過這個:

Object.defineProperty(window,'whatever',{
    set:function(x){
        if (x.startsWith('https://')) this.whatever= x}
})

但是當我做window.whatever = "https://example.com"它說: Uncaught RangeError: Maximum call stack size exceeded and it's still undefined

更新:提供更好的解決方案。 在上一個中, __globalVar沒有被隱藏,您可以直接訪問它(讀/寫)。 這可能不是最好的主意,所以這里有一個更好的方法:

 (function () { let privateValue = "Hello"; Object.defineProperty(window, "whatever", { get: function () { console.log("in getter"); return privateValue; }, set: function (val) { console.log("in setter"); if (typeof val === "string" && val.startsWith("https://")) { privateValue = val; } else { throw "Invalid whatever"; } }, }); })(); console.log(window.whatever); window.whatever = "https://stackoverflow.com"; console.log(window.whatever); window.whatever = "lalala123"; console.log(window.whatever);

現在privateValue實際上是私有的。


這樣的事情對你有用嗎? 我認為它的行為就像你描述的那樣。

 let __globalVar = 'Hello'; Object.defineProperty(window, 'whatever', { get() { console.log('in getter'); return __globalVar; }, set(val) { // put your logic here console.log('in setter'); if( val.startsWith("https://") ) { __globalVar = val; } else { throw "Invalid whatever" } } }) console.log(window.whatever); window.whatever = "https://google.com"; console.log(window.whatever); window.whatever = "lalala123"; console.log(window.whatever);

暫無
暫無

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

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