I have decided to use CoffeeScript and i have been trying to convert Node.js module of mine to CoffeeScript. So, here is the code in JS:
function Domain(obj){
var self = this;
for (var key in obj){
this[key] = obj[key]; //merge values
}
}
Domain.prototype.save = function(fn){
}
And my attempt to have the same in the CoffeeScript as following:
class Domain
consructor: (obj) ->
for own key, value of obj
@key = value
save: (fn) ->
module.exports = Domain
The following test fails:
require('coffee-script');
var should = require('should')
, Domain = require('../index');
should.exist(Domain);
var domain = new Domain({'attOne':1, 'attTwo':2});
domain.should.have.property('save');
domain.should.have.property('attOne');
domain.should.have.property('attTwo');
domain.save.should.be.an.instanceof(Function);
console.log('All tests passed');
The property 'attrOne' and 'attrTwo' is not binding to the Domain class. I have compiled the coffee code by 'coffee -c index.coffee' to see the js code:
(function() {
var Domain,
__hasProp = {}.hasOwnProperty;
Domain = (function() {
function Domain() {}
Domain.prototype.consructor = function(obj) {
var key, value, _results;
_results = [];
for (key in obj) {
if (!__hasProp.call(obj, key)) continue;
value = obj[key];
_results.push(this.key = value);
}
return _results;
};
Domain.prototype.save = function(fn) {};
return Domain;
})();
module.exports = Domain;
}).call(this);
From the compiled js, i see the '_result' array being generated and returned but never binded to 'this'. How would i bind the array into the class scope to pass the test?Thank You
Your line of CoffeeScript
@key = value
is not equivalent to the javascript you want
this[key] = obj[key];
The way @ works is that it is simply replaced by either this or this.. Thus, @key compiles to this.key. You should instead use
@[key] = value
Additionally, you spelled constructor wrong (as consructor). In CoffeeScript, constructor is a special method that compiles differently from a normal method; if it is spelled wrong, CoffeeScript assumes you want an empty one.