【问题标题】:How to detect the variable when used?使用时如何检测变量?
【发布时间】:2018-04-02 02:24:21
【问题描述】:

如何在每次调用变量时调用函数?下面的代码是可能的吗? 我打算每次使用“num”时调用一个函数..

if (num == 100 && num== 200 && num==300) {
  console.log('it works!');
}

【问题讨论】:

  • 你能展示一个你将如何使用它的例子吗?

标签: javascript function variables


【解决方案1】:

valueOf 滥用是一种选择,但还有很多其他选择。

const num = {
  value: 0,
  valueOf: function() {
    this.value += 100;
    return this.value;
  }
}
if (num == 100 && num== 200 && num==300) {
  console.log('it works!');
}

【讨论】:

    【解决方案2】:

    您可以使用 Javascript proxy object 为包括赋值在内的基本操作定义自定义行为。

    您可以使用它覆盖数组、对象等的方法。

    请在 MDM 中找到一个示例。这个有一个设置属性值的陷阱。我们可以为 set、has 和其他操作(如构造函数等)设置陷阱。

    let validator = {
      set: function(obj, prop, value) {
        if (prop === 'age') {
          if (!Number.isInteger(value)) {
            throw new TypeError('The age is not an integer');
          }
          if (value > 200) {
            throw new RangeError('The age seems invalid');
          }
        }
    
        // The default behavior to store the value
        obj[prop] = value;
    
        // Indicate success
        return true;
      }
    };
    
    let person = new Proxy({}, validator);
    
    person.age = 100;
    console.log(person.age); // 100
    person.age = 'young'; // Throws an exception
    person.age = 300; // Throws an exception
    

    【讨论】:

      【解决方案3】:

      toString 也可以:

      const num = {
        value: 0,
        toString: function() {
          this.value += 100;
          return this.value;
        }
      }
      if (num == 100 && num== 200 && num==300) {
        console.log('it works!');
      }

      不过,valueOf 首选

      const num = {
        value: 0,
        toString: function() {
          this.value += 1000;
          return this.value;
        },
        valueOf: function() {
          this.value += 100;
          return this.value;
        }
      }
      if (num == 100 && num == 200 && num == 300) {
        console.log('it works with valueOf');
      }
      
      if (num == 1000 && num == 2000 && num == 3000) {
        console.log('it works with toString');
      }

      【讨论】:

      • 为什么它不能在 console.log() 中工作?我认为每次调用 num 的值都在变化..顺便说一句谢谢。 :)
      • @PauloDelaCruz 什么?哪一个?
      • 两者。我尝试 console.log(num) 3 次,我认为它会返回 100,200,300。这仅在 if 语句中有效吗?
      • @PauloDelaCruz,这是你想要的吗?让 n = 0; Object.defineProperty(window, "num", { get() { return (n += 100); } });控制台.log(num);控制台.log(num); console.log(num);
      猜你喜欢
      • 2010-10-09
      • 2014-04-20
      • 2019-01-21
      • 2016-09-23
      • 2014-12-25
      • 2017-06-12
      • 1970-01-01
      • 2016-08-16
      相关资源
      最近更新 更多