猿问

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

图像您有一个名为 的全局变量。如果要存储在其中的新值不符合某些条件,是否可以阻止任何人更改其类型和值?window.whatever


例如,如果我的变量不以“https://”开头,我不希望更改它。


在这种情况下,会抛出一个错误,但工作正常。window.whatever = "Hello"window.whatever = 15window.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


心有法竹
浏览 134回答 1
1回答

浮云间

更新:提供更好的解决方案。在上一个中,没有隐藏,您可以直接访问它(读/写)。这可能不是最好的主意,所以这里有一个更好的方法:__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);
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答