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
用来声明B
和A
之间的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来检查是否忠实再现。)
这是发生了什么事情:
- 直接在
parent
上find的所有密钥都设置在child
。 - 创build一个新的原型构造函数
ctor
,将其实例的constructor
属性设置为子项,并将其prototype
设置为父项。 - 子类的
prototype
被设置为ctor
一个实例。ctor
的constructor
将被设置为child
,而ctor
的原型本身就是parent
。 - 子类的
__super__
属性被设置parent
类的prototype
,供CoffeeScript的super
关键字使用。
节点的文档描述util.inherits
如下:
将原型方法从一个构造函数inheritance到另一个构造函数。 构造函数的原型将被设置为由superConstructor创build的新对象。
作为一个额外的便利,superConstructor将可以通过constructor.super_属性访问。
总之,如果使用CoffeeScript的类,则不需要使用util.inherits
; 只需使用CS给你的工具,你就可以得到像super
关键字一样的奖金。