JS同様、closureを使うのです。
fuga.coffee
_ivar = null #this is an ivar
module.exports = class Fuga
constructor: -> _ivar = 'initated'
ivar: -> _ivar
setIvar: (x) -> _ivar = x
使ってみると、
Fuga = require './fuga'
fuga = new Fuga()
console.log fuga.ivar()
# initiated
fuga.setIvar 'changed'
console.log fuga.ivar()
# changed
console.log fuga._ivar
# undefined
_ivarに直接アクセス出来ませんね。
Object.definePropertyと一緒に使うと面白いと思います。
結果的にはこういう風にコンパイルされます。
fuga.js
// Generated by CoffeeScript 1.4.0
(function() {
var Fuga, _ivar;
_ivar = null;
module.exports = Fuga = (function() {
function Fuga() {
_ivar = 'initated';
}
Fuga.prototype.ivar = function() {
return _ivar;
};
Fuga.prototype.setIvar = function(x) {
return _ivar = x;
};
return Fuga;
})();
}).call(this);
訂正:以下のコードでは継承時に不具合が起こります。
kaminaly、ありがとうございました。
class Fuga
constructor: ->
_ivar = 'initated'
@ivar = -> _ivar
@setIvar = (x) -> _ivar = x