在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对它们有点熟悉。
答案 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}!"