2011-10-06 64 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 

,但这不是那么聪明,你可以将布尔值存储在一个对象,并通过这个对象作为参考