【问题标题】:Is it possible to override certain Javascript commands?是否可以覆盖某些 Javascript 命令?
【发布时间】:2017-10-22 09:30:06
【问题描述】:

如果我创建了一个具有数组作为属性的对象,是否可以在该对象中编写一个方法,以便在创建实例后,硬编码命令现在的行为有所不同?

例如,如果我定义了一个构造函数:

function Bunny(){
       this.arr = [1,2,3];
       this.doSomething = function(){
         //  do something here
        } 
 }

然后创建一个新实例:

fluffy = new Bunny();

是否可以在“this.doSomething”中写一些东西,这样当我执行预定义的命令时,比如:

fluffy.arr[0]=7;

最终的操作(除了将数组的第 0 个条目从 1 更改为 7 之外,也不是将其更改为 7)就是弹出一个警告,上面写着“复活节快乐!”?

【问题讨论】:

  • @LincolnBergeson 相关问题的答案几乎没有提到Proxy,这是现在这样做的正确方法。
  • @Alnitak getter 和 setter 没有希望了吗?
  • @LincolnBergeson AFAIK 除了通过Proxy 之外,无法实现对(最初)未定义数组索引属性的访问。 Getter 和 setter 仅适用于您已经知道的属性。

标签: javascript methods javascript-objects


【解决方案1】:

在某种程度上你可以。输入:Proxies

代理充当对象的包装器,并允许您拦截该对象属性上的某些事件。

let arr = [1, 2, 3];

// Wrap the array in a proxy
arr = new Proxy(arr, {
  get(target, name) {
    // Whenever the user accesses the ith element
    // alert, 'Happy Easter! i'
    alert(`Happy Easter! ${name}`);
    
    // Return the actual value
    return target[name];
  },
  
  // You can also target setters
  set(target, name, value) {
    // Whenever the user sets the ith element
    // alert, 'Merry Christmas! i'
    alert(`Merry Christmas! ${name}`);
    
    target[name] = value;
  }
});

// Can still set values since a setter wasn't set
arr[0] = 7;
console.log(arr[0]);

【讨论】:

  • 太棒了!谢谢!是否也可以在用户访问第 i 个元素时执行一个操作,以 alert('Happy Easter!'+i)?
  • @bloomers 绝对!我刚刚更新了我的答案,以展示你如何做到这一点。
  • 太棒了!非常感谢!
猜你喜欢
  • 2022-11-23
  • 2011-04-02
  • 1970-01-01
  • 2019-03-02
  • 1970-01-01
  • 2011-01-03
  • 2014-01-07
  • 1970-01-01
  • 2020-12-24
相关资源
最近更新 更多