2011-10-06 71 views
4

我想用原型函數來擴展布爾對象,該函數將其反轉爲當前值。到目前爲止,我一直在做這樣的事情:使用'反轉'功能在JavaScript中擴展布爾對象

var bool = true; 
bool = !bool; 
console.log(bool); // false 

我試圖擴展布爾對象並不富有成效。這是我得到了多少:

Boolean.prototype.invert = function() { 
    return !this.valueOf(); 
} 

var bool = true; 
bool = bool.invert(); 
console.log(bool); // false 

關閉,但不夠接近。我找了沿着這些路線的解決方案:

var bool = true; 
bool.invert(); 
console.log(bool); // false 

是的,我知道,擴展內置的對象通常被認爲是一個壞主意。請讓我們另存一天的討論。

+6

但是,除了你試圖改變狀態的事實之外,還有什麼意思呢?除了試圖避免簡單的重新分配之外,其他的目的是什麼:'bool =!bool;'? –

+0

也許我應該改寫一下這個問題:我怎樣才能用原型來改變對象的狀態......謝謝。 – trembl

+1

相關:http://stackoverflow.com/questions/4066094/change-value-of-a-wrapped-primitive-data-type – CMS

回答

4

標量值在所有OOP語言不可變的,你需要一個新的類

var BooleanBuilder = function(data){ this._data = !!data; }; 

BooleanBuilder.prototype.valueOf = function() { 
    return this._data; 
}; 
BooleanBuilder.prototype.invert = function() { 
    this._data = !this._data; 
}; 

var bool = new BooleanBuilder(true); 
alert(bool.valueOf()); 
bool.invert(); 
alert(bool.valueOf()); // false 

,但這不是那麼聰明,你可以將布爾值存儲在一個對象,並通過這個對象作爲參考