为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

心有法竹 2022-09-29 16:55:52
图像您有一个名为 的全局变量。如果要存储在其中的新值不符合某些条件,是否可以阻止任何人更改其类型和值?window.whatever例如,如果我的变量不以“https://”开头,我不希望更改它。在这种情况下,会抛出一个错误,但工作正常。window.whatever = "Hello"window.whatever = 15window.whatever = "https://example.com/"也许会解决它,但我不知道如何。Object.definePropertyObject.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
查看完整描述

1 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

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


查看完整回答
反对 回复 2022-09-29
  • 1 回答
  • 0 关注
  • 133 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号