coffeescript中的'extends'与node.js中的'util.inherits'之间的差异

时间:2012-05-21 03:42:10

标签: node.js coffeescript

我最近在学习Node.js。我对Node.js中的函数util.inherits有疑问。我可以在coffeescript中使用extends来替换它吗?如果没有,它们之间有什么区别?

1 个答案:

答案 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用于声明BA之间的继承关系。

让我们在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检查这是忠实的复制品。)

以下是发生的事情:

  1. 直接在parent上找到的所有密钥都设置在child
  2. 创建了一个新的原型构造函数ctor,其实例的constructor属性设置为子级,其prototype设置为父级。
  3. 子类的prototype设置为ctor的实例。 ctor的{​​{1}}将设置为constructor,而child的原型设置为ctor
  4. 子类的parent属性设置为__super__的{​​{1}},供CoffeeScript的parent关键字使用。
  5. node's documentation描述prototype如下:

      

    将原型方法从一个构造函数继承到另一个构造函数。该   构造函数的原型将被设置为从中创建的新对象   超类。

         

    作为额外的便利,superConstructor将是可访问的   通过constructor.super_ property。

    总之,如果您正在使用CoffeeScript的类,则不需要使用super;只需使用CS为您提供的工具,您就可以获得util.inherits关键字等奖励。