Как я могу создать подкласс Boolean для изменения строкового представления без негативных побочных эффектов вне моей функции? - PullRequest
0 голосов
/ 23 ноября 2011

Мне нужен способ оборачивать логическое значение таким образом, чтобы сравнение не прерывалось и строковый результат отличался от 'false' или 'true' без изменения глобальных логических значений

function TestIt(bool){
    if(wrapper(bool) == true)
        return "it was: " + wrapper(bool)
    if(wrapper(bool) == false)
        return "it was: " + wrapper(bool)
    return "no dice"
}

например

var result;
result = TestIt(true);
// "it was: True"
result = TestIt(false);
// "it was: False"

Записанные мною попытки не смогли одновременно выполнить все перечисленные ниже условия:

var initial = true;
var result1;
var result2;
(function(){
    result1 = wrapper(true);
    result2 = wrapper(true);
})()
// result1 == result2
// result1 == true
// result1.toString() != initial.toString()
// initial.toString() == true.toString()
// initial.toString() == (new Boolean(true)).toString()

Кто-нибудь может мне помочь, пожалуйста?

Мне нужно это (автоматическое) альтернативное преобразование строк, чтобы я мог продублировать строку, созданную в среде сервера, на другом языке и точно сопоставить ее.

~~~~~~

Редактировать

~~~~~~

Я забыл упомянуть, что проблема, с которой я сталкиваюсь, заключается вЛогический метод "valueOf", который вызывается вместо toString (очевидно) для конкатенации строк.

~~~~~~

Edit # 2

~~~~~~

Это также должно работать для false.Я просто оставил это для краткости.Однако, обертка (false) == false доставила мне головную боль.

~~~~~~

Edit Final

~~~~~~

Оказывается (в ответах ниже), что вы не можете переопределить поведение по умолчанию, как я хотел, если используется конкатенация строк.Я собираюсь поработать с использованием массива для решения моей проблемы, а затем делать пользовательские преобразования, когда я снова присоединяюсь к нему.Похоже, что Javascript требует странного подхода к концептуально простой проблеме.

Пример кода для командной строки:

function boolish(a){a=new Boolean(a);a.toString=function(){return this.valueOf()?"True":"False"};return a};

boolish(false) == false
boolish(true) == true
boolish(false) + " or " + boolish(true)
[boolish(false) , " or " , boolish(true)].join("~~~~~~~~")

Ответы [ 2 ]

0 голосов
/ 23 ноября 2011

Вы можете сделать что-то вроде:

function myBool(value) {
  this.value = value;
}
myBool.prototype.toString = function() {
  return 'The value is ' + (this.value? 'true' : 'false');
}

var x = new myBool(true);

alert(x);  // 'The value is true'
0 голосов
/ 23 ноября 2011

Я не понимаю, почему вы думаете, что вам нужно, чтобы это происходило автоматически через toString().Если у вас есть «простой» логический тип, вы можете (очевидно) использовать его в любых сравнениях как обычно, но если вы хотите получить какой-то нестандартный текст при объединении, просто укажите его в данный момент.Например, если вы хотите, чтобы «TRUE» и «FALSE» были написаны заглавными буквами:

var myBool1 = false,
    myBool2 = true;

alert("The value of myBool1 is: " + (myBool1?"TRUE":"FALSE"));

Или вы могли бы написать небольшую функцию:

function boolToString(val) {
   return val ? "True enough" : "That's a lie!";
}

alert("The value of myBool2 is: " + boolToString(myBool2));

EDIT В соответствии со следующим SO вопросом (и ответами): valueOf () против toString () в Javascript ваше требование не может быть выполнено.Оператор конкатенации строк + всегда будет использовать valueOf вместо toString.Я согласен, что это странно.Обходной путь - объединить строки без использования оператора +, но я понимаю, что вы не хотите этого делать.

...