![](/img/trans.png)
[英]How can I change the value of an objects property IF and only IF that value meets a certain condition? (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.