如何从 JavaScript 中的 chaininig 中动态排除对象?

How to dynamically exclude the object from the chaininig in JavaScript?

我得到了对象结构,其中 utilsutils.not 采用相同的原型(使用 exist 方法)。我简化了它以使其更清楚:

var negative = true;
if(negative){
  //when negative===true, I want to run exist() through not object
  tests.utils.not.exist();
} else {
  tests.utils.exist();
}

有没有其他方法可以将 not 从链中排除而不是使用 IF?如果我想将 not 对象更改为另一个对象,例如 positive,我可以这样做:

tests.utils[negative ? 'not':'positive'].exist();

但是如何从链中动态排除 not 对象? 我的 IF 语法工作正常,但我只是想知道 JS 中是否有另一种(更优雅的)方式。

删除条件(if 或三元运算符)的唯一方法是将其隐藏在 exist() 方法中:

tests.utils.exist(negative); // true or false

并让 exist 方法选择逻辑。但我认为您当前的代码更清晰,显式 if 有助于更好地阅读和理解它,我不认为它是不优雅的代码。

由于您的 'to be executed' 方法取决于条件(负数 === true),您无法真正避免检查。但是,您可以编写一些智能代码:

let method = test.utils.exist; 
if (negative) {
  method = test.utils.not.exist;
}

method();

您可以使用代理来设置默认行为,然后按照您想要的方式调用它们,请查看示例

var handler = {
  get: function(target, name) {
    return target.hasOwnProperty(name) ? target[name] : target["default"];
  }
};

var p = new Proxy({
 default : {
  exists : function(){
   return 1;
  }
 },
 not : {
  exists : function(){
   return 2;
  }
 }       
}, handler);

let negative = false;

let x = p[negative === true ? "not" : "default"];
console.log(x.exists());

看看MDN docs

不确定这是否有用,但你可以这样做。

var objectToTrigger = negative ? tests.utils.not : tests.utils;
objectToTrigger.exist();