I am learning Node.js recently. I have a question about the function util.inherits in Node.js. Can I use extends in coffeescript to replace it? If not, what are the differences between them?
Yes, you can use extends in place of it.
As for the differences? Let's start with a look at CoffeeScript:
class B extends A
Let's look at the JavaScript the CoffeeScript compiler produces for this JavaScript:
var B,
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
B = (function(_super) {
__extends(B, _super);
function B() {
return B.__super__.constructor.apply(this, arguments);
}
return B;
})(A);
So, __extends is used to declare the inheritence relationship between B and A.
Let's restate __extends a bit more readably, in CoffeeScript:
coffee__extends = (child, parent) ->
child[key] = val for own key, val of parent
ctor = ->
@constructor = child
return
ctor.prototype = parent.prototype
child.prototype = new ctor
child.__super__ = parent.prototype
return child
(You can check that this is a faithful reproduction by compiling it back to JavaScript.)
Here's what's happening:
parent are set on child.ctor is created, with its instances' constructor properties set to the child, and its prototype set to the parent.prototype is set to an instance of ctor. ctor's constructor will be set to child, and ctor's prototype itself is parent.__super__ property is set to parent's prototype, for use by CoffeeScript's super keyword.node's documentation describes util.inherits as follows:
Inherit the prototype methods from one constructor into another. The prototype of constructor will be set to a new object created from superConstructor.
As an additional convenience, superConstructor will be accessible through the constructor.super_ property.
In conclusion, you don't need to use util.inherits if you're using CoffeeScript's classes; just use the tools CS gives you, and you get bonuses like the super keyword.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With