2017-08-16 39 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()' –

相關問題