2016-05-19 100 views
0

有沒有一種方法來定義一個方法在object/class在JavaScript中像toString只爲布爾值?示例(ES6):toBoolean方法類似toString

class MyClass { 
    toBoolean() { 
    return this.foo === bar; 
    } 
} 

,所以我可以做這樣的事情

const myClass = new MyClass(); 
if (myClass === true) baz(); 

聽起來很瘋狂給我,但我要問不過。

+0

它甚至不會像字符串那樣工作 – Rhumborl

+2

使用'==='時不會發生類型強制 –

+4

您不能做像C++中重載cast操作符那樣的東西。 'toString'只是有點特殊,因爲許多函數隱式地嘗試在你的對象上調用'toString',但'==='不會做那樣的事情。所以沒有辦法將它神奇地轉換爲布爾值來進行比較。我們仍然需要使用if(myClass.toBoolean()=== true)',然後通過它的實際名稱命名該方法會更有意義。 'if(myClass.isValid())':P – CherryDT

回答

4

除了它將成爲drewmoore所指出的蠕蟲之外,它根本不可能在JavaScript中完成。

沒有像在C++中重載cast操作符那樣的「掛鉤類型轉換」功能。

爲什麼toString似乎做同樣的事情的原因是,只是因爲許多functions implicitly try calling toString on your objects, and the JavaScript interpreter also does this when you try to concatenate something to a string using +===不會做類似的事情 - 事實上,===的「賣點」是它沒有類型轉換

所以沒有辦法將它神奇地轉換爲布爾值來進行比較。仍然需要使用if(myClass.toBoolean() === true),然後通過它的實際功能命名該方法會更有意義。 if(myClass.isValid())或其他。

1

恕我直言,即使有可能它會是一個可怕的念頭:

const myClass = new MyClass(); 

myClass.foo = true; 
if (myClass === true) baz(); //true 
if (myClass) foobaz(); //true, as expected, since myClass === true 

myClass.foo = false; 
if (myClass === true) baz(); // false 
if (myClass) foobaz(); //true - wtf? 
-1

這將解決您的問題,將任何類型轉換爲布爾。

function Fun(){ 

} 
Fun.prototype.toBoolean = function(a) { 
    return !!a; 
} 

var obj = new Fun("str"); 
obj.toBoolean("str"); 
obj.toBoolean(1); 
obj.toBoolean({}); 
obj.toBoolean(0); 
+0

@Thilo刪除它。 – murli2308