如何使类的属性不区分大小写?

时间:2014-07-30 19:40:19

标签: javascript class oop object coffeescript

在CoffeeScript中,我们说我得到了以下内容:

class Greeter
    message: ->
        greeting = switch @gender
            when 'male' then 'Sir'
            when 'female' then 'Madame'
            else 'Unknown'

        "Hello #{greeting}!"

greeter = new Greeter
greeter.gender = 'Male'
alert greeter.message()

当我希望它输出Hello Unknown!时,它会提醒Hello Sir!

如何使Greeter类小写@gender实例变量以便实现正确的输出?我不想在message方法中将其小写,而是在整个类的实例中。这样它也适用于其他方法。

我想我错过了一些非常基本的东西,但我似乎无法绕过它。

注意:对于那些说'#34;男"'的大写错误的人。是的,我故意这样做。在使用之前,我希望在所有情况下自动小写gender。因此,用户可能会错误地获取大写,并且仍然有效。

原因是我最终想把它推断到其他情况,而不仅仅是那些处理不区分大小写问题的情况。

有些人提到了JavaScript Getters和Setters,它们相对较新,因此并不是所有主流浏览器都支持。我来看看那些。我通过Ruby对它们有点熟悉。

2 个答案:

答案 0 :(得分:2)

Male不是male。尝试将字符串规范化为小写:

message: ->
    greeting = switch @gender.toLowerCase()
        when 'male' then 'Sir'
        when 'female' then 'Madame'
        else 'Unknown'

如果有必要,您可能希望在某些属性 getter 中将调用封装为小写:https://stackoverflow.com/a/11592890/2363712类似的内容:

class Greeter
    constructor: ->
        Object.defineProperty  @, 'gender',
            get: ->
                return @_gender
            set: (value) ->
                @_gender = value.toLowerCase()

    message: ->
        greeting = switch @gender
            when 'male' then 'Sir'
            when 'female' then 'Madame'
            else 'Unknown'

        "Hello #{greeting}!"

要实现此目的,您的运行时环境必须支持Object.defineProperty
请参阅that table以快速查找支持的浏览器。

答案 1 :(得分:0)

coffee> 
  class Greeter
    message: =>
        greeting =
          if /^male/i.test(@gender) then 'Sir'
          else if /^female/i.test(@gender) then 'Madame'
          else 'Unknown'

        "Hello #{greeting}!"

greeter = new Greeter
greeter.gender = 'Male'
greeter.message()

'Hello Sir!'
coffee> greeter.gender  = 'female' 
'female'
coffee> greeter.message()
'Hello Madame!'
coffee> greeter.gender  = 'smizmar' 
'smizmar'
coffee> greeter.message()
'Hello Unknown!'
coffee> 

所以这是一种简单的方法,但它不会改变存储的值。为此,您需要使用Object.defineProperty (SO answer about it)

Function::property = (prop, desc) ->
  Object.defineProperty @prototype, prop, desc

class Greeter
  constructor: () ->
  @property 'gender',
    get: -> "#{@ciGender}"
    set: (v) -> @ciGender = v.toLowerCase()
  message: ->
    greeting = switch @ciGender
        when 'male' then 'Sir'
        when 'female' then 'Madame'
        else 'Unknown'

    "Hello #{greeting}!"