2017-08-16 55 views
0

我有对象结构,其中utilsutils.not采取相同的原型(与exist方法)。我简化它更清楚:如何在JavaScript中动态地从chaininig中排除对象?

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

是否有任何其他的方式来排除链,而不是使用IFnot?如果我想改变not对象到另一个,如positive,我能做到这一点只是这样的:

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

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

+0

这是柴吗?如果是这样,请问一个关于柴的问题。 – Ryan

回答

0

您可以使用代理服务器设置默认行为,然后打电话给他们,你想看看例子

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

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

 
let negative = false; 
 

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

方式

看看MDN docs

+0

代理从不是必需的,这里包括。你可以完全删除代理,它不会有所作为。 – Ryan

+0

我只是想说我们可以将默认返回类型添加到对象,比如默认情况下返回exists()而不是not.exists() – marvel308

+0

代理不是必需的。使用一个是误导。 – Ryan

1

以除去条件(如果或三元操作者)的唯一方法是在exist()方法内隐藏它:

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

而让存在方法选择的逻辑。但我认为你现在的代码更清晰,明确的if有助于更好地阅读和理解它,我不认为它是一个非优雅的代码。

0

由于你的'被执行'方法取决于条件(负===真),你不能真正避免检查。然而,你可以写一些聪明的代码:

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

method(); 
1

不知道这是否有用,但你可以这样做。

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

是的,最后我做了类似于这个函数内,只是返回有或没有对象的链'objectToTrigger(负) .exist()' –

相关问题