coffeescript中的'extends'和node.js中的'util.inherits'之间的区别

我最近在学习Node.js。 我有一个关于Node.js中的函数util.inherits的问题。 我可以在coffeescript中使用extends来replace它吗? 如果不是,他们之间有什么分别?

是的,你可以使用extends来代替它。

至于差异? 我们先来看看CoffeeScript:

 class B extends A 

让我们来看看CoffeeScript编译器为这个JavaScript 产生的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); 

所以, __extends用来声明BA之间的inheritance关系。

在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 

(您可以通过编译回JavaScript来检查是否忠实再现。)

这是发生了什么事情:

  1. 直接在parent上find的所有密钥都设置在child
  2. 创build一个新的原型构造函数ctor ,将其实例的constructor属性设置为子项,并将其prototype设置为父项。
  3. 子类的prototype被设置为ctor一个实例。 ctorconstructor将被设置为child ,而ctor的原型本身就是parent
  4. 子类的__super__属性被设置parent类的prototype ,供CoffeeScript的super关键字使用。

节点的文档描述util.inherits如下:

将原型方法从一个构造函数inheritance到另一个构造函数。 构造函数的原型将被设置为由superConstructor创build的新对象。

作为一个额外的便利,superConstructor将可以通过constructor.super_属性访问。

总之,如果使用CoffeeScript的类,则不需要使用util.inherits ; 只需使用CS给你的工具,你就可以得到像super关键字一样的奖金。