我如何创建一个变量,仅当要分配给它的新值满足javascript中预定义的条件时,才能更改其值?

问题描述 投票:1回答:1

图像您有一个名为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,但仍未定义

javascript global-variables const
1个回答
2
投票
UPDATE:提供更好的解决方案。在上一个中,__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);
© www.soinside.com 2019 - 2024. All rights reserved.