我最近在学习Node.js。我对Node.js中的函数util.inherits
有疑问。我可以在coffeescript中使用extends
来替换它吗?如果没有,它们之间有什么区别?
答案 0 :(得分:23)
是的,您可以使用extends
代替它。
至于差异?让我们先来看看CoffeeScript:
class B extends A
让我们看一下这个JavaScript的the JavaScript the CoffeeScript compiler produces:
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);
因此,__extends
用于声明B
和A
之间的继承关系。
让我们在CoffeeScript中重复一点__extends
:
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
(您可以通过compiling it back to JavaScript检查这是忠实的复制品。)
以下是发生的事情:
parent
上找到的所有密钥都设置在child
。ctor
,其实例的constructor
属性设置为子级,其prototype
设置为父级。prototype
设置为ctor
的实例。 ctor
的{{1}}将设置为constructor
,而child
的原型设置为ctor
。parent
属性设置为__super__
的{{1}},供CoffeeScript的parent
关键字使用。 node's documentation描述prototype
如下:
将原型方法从一个构造函数继承到另一个构造函数。该 构造函数的原型将被设置为从中创建的新对象 超类。
作为额外的便利,superConstructor将是可访问的 通过constructor.super_ property。
总之,如果您正在使用CoffeeScript的类,则不需要使用super
;只需使用CS为您提供的工具,您就可以获得util.inherits
关键字等奖励。