【问题标题】:Javascript Object constructor override to stop certain methods be calledJavascript 对象构造函数覆盖以停止调用某些方法
【发布时间】:2020-04-21 03:33:12
【问题描述】:

创建了一个像“Obj”这样的全局对象:

Obj = {     
   gtm : {},
   method: function(){console.log("Method is called");}
};

在其他一些地方使用Obj.method()

我的问题是我能否以任何方式扩展“Obj”的代码以阻止对Obj.method() 的调用。 我不想重写或删除其他地方的代码,因为那将是很多变化。相反,我想更改原始代码,以便在某些情况下我不会调用该方法。

代理不是一个选项,因为代理还需要我更改其他地方的呼叫。并且代理在 IE 11 中不起作用。

我可以重写构造函数并实现我想要的吗?

感谢和问候

【问题讨论】:

  • 我看不到任何方法可以用这段代码调用。
  • 有机会纠正 sn-p 吗?目前,$data 都没有在创建函数中使用。而且,method 甚至没有附加到返回的对象。
  • @TKoL 我已经编辑了问题中的代码。
  • @WiktorZychla 我已经编辑了问题中的代码。
  • "我可以重写构造函数吗" — 示例中没有构造函数。

标签: javascript javascript-objects javascript-inheritance


【解决方案1】:
  1. 将函数复制到其他地方。
  2. 编写一个调用它的新函数。
  3. 将该函数分配给对象属性。

这样的:

(function () {
    // IIFE for scope so we don't create another global (`method` on the next line)
    const method = Obj.method;
    const new_method = function() {
        if (your_condition) {
            method();
        }
    };
    Obj.method = new_method;
})();

如果this 的值或任何参数很重要,您需要传递它们。

例如

method.apply(this, arguments);

【讨论】:

  • 我想要类似:constructor(){ if(condition){ propagate and execute the called method} else{ do not do anything} } 有可能以某种方式实现吗?
  • 您有一个使用对象初始化程序生成的单例。由于您没有class,因此没有任何意义。此答案中的代码通过重写现有对象来实现相同的最终结果。
【解决方案2】:

我不完全确定你在找什么,但你说

“相反,我想更改原始代码,以便在某些条件下我不会调用该方法。”

那么为什么不做这样的事情:

Obj = {     
   gtm : {},
   method: function(){
      if (someCondition) return;
      // do rest of the method here
   }
};

【讨论】:

    猜你喜欢
    • 2012-01-15
    • 1970-01-01
    • 2014-06-09
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 2018-08-20
    相关资源
    最近更新 更多