Можно сахар написать (и можно его даже написать не засирая прототип, просто тогда надо будет писать set @, 'name' а не @set 'name')
Function.prototype.get = (name, getter)->
Object.defineProperty @prototype, name,
set: Object.getOwnPropertyDescriptor(@prototype, name)?.set
get: getter
configurable: yes
enumerable: yes
Function.prototype.set = (name, setter)->
Object.defineProperty @prototype, name,
get: Object.getOwnPropertyDescriptor(@prototype, name)?.get
set: setter
configurable: yes
enumerable: yes
class Cat
@get 'name', -> alert 'GET NAME!!!'
@set 'name', -> alert 'SET NAME!!!'
(new Cat).name
(new Cat).name = 22
compile to:
var Cat;
Function.prototype.get = function(name, getter) {
var ref;
return Object.defineProperty(this.prototype, name, {
set: (ref = Object.getOwnPropertyDescriptor(this.prototype, name)) != null ? ref.set : void 0,
get: getter,
configurable: true,
enumerable: true
});
};
Function.prototype.set = function(name, setter) {
var ref;
return Object.defineProperty(this.prototype, name, {
get: (ref = Object.getOwnPropertyDescriptor(this.prototype, name)) != null ? ref.get : void 0,
set: setter,
configurable: true,
enumerable: true
});
};
Cat = (function() {
function Cat() {}
Cat.get('name', function() {
return alert('GET NAME!!!');
});
Cat.set('name', function() {
return alert('SET NAME!!!');
});
return Cat;
})();
(new Cat).name;
(new Cat).name = 22;
Можно вот так писать для красоты и.т.п.
class Cat
get Cat, 'name', ->
alert 'GET NAME!!!'
set Cat, 'name', ->
alert 'SET NAME!!!'