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