我最近在學習Node.js。我有一個關於Node.js中的函數util.inherits
的問題。我可以在咖啡腳本中使用extends
來代替它嗎?如果不是,他們之間有什麼區別?coffeescript中的'extends'和node.js中的'util.inherits'之間的區別
14
A
回答
23
是的,您可以使用extends
來代替它。
至於差異?讓我們先來看看CoffeeScript的:
class B extends A
讓我們來看看the JavaScript the CoffeeScript compiler produces爲這個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
之間的傳承關係。
讓我們重申__extends
多一點可讀,在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
(您可以檢查,這是由compiling it back to JavaScript的忠實再現。)
這裏的發生的事情:
- 直接在
parent
上找到的所有密鑰都設置在child
上。 - 創建了一個新的原型構造函數
ctor
,其實例的constructor
屬性設置爲子項,其prototype
設置爲父項。 - 子類的
prototype
設置爲ctor
的實例。ctor
的constructor
將被設置爲child
,並且ctor
的原型本身是parent
。 - 子類的
__super__
屬性設置爲parent
的prototype
,供CoffeeScript的super
關鍵字使用。
node's documentation描述util.inherits
如下:
繼承從一個構造原型方法到另一個。 構造函數的原型將被設置爲從 superConstructor創建的新對象。
作爲額外的便利,superConstructor將通過constructor.super_屬性訪問 。
總之,如果您使用CoffeeScript的類,則不需要使用util.inherits
;只需使用CS爲您提供的工具,即可獲得super
關鍵字等獎金。
相關問題
- 1. 利用CoffeeScript`extends`與Backbone.js`extend`之間的根本區別`
- 2. Node.js中app.js和index.js之間的區別
- 3. node.js中console.log和sys.puts之間的區別?
- 4. Node.js中path.normalize和path.resolve之間的區別
- 5. Laravel的'extends Authenticatable'和'extends Model'之間有什麼區別?
- 6. Extends和Instantiation之間有什麼區別?
- 7. 「?extends E」和「T extends E」之間有什麼區別?
- 8. node.js,casper.js和phantom.js之間的區別?
- 9. <extends Comparable>和<extends Comparable < T >>之間的區別?
- 10. util.inherits in coffeescript
- 11. Android中的Extends Application和Extends Activity有什麼區別?
- 12. node.js和console.log中的連接閃存之間的區別?
- 13. Node.js + Express中的request.cookies ['name']和request.cookies.name之間的區別
- 14. node.js的util.inherits VS新
- 15. make中的「$(shell ...)」和「$$(...)」之間的區別
- 16. python中的[]和[,,]之間的區別
- 17. javascript中的/ * * /和//之間的區別
- 18. $之間的區別?和PowerShell中的$ LastExitCode
- 19. jQuery中的$和$()之間的區別
- 20. C中的/ +和+之間的區別?
- 21. 之間的〜/和的區別../
- 22. PHP中cURL和SOAP之間的區別?
- 23. angularfire中$ getAuth和$ onAuth之間的區別
- 24. C#中char和int之間的區別#
- 25. Hibernate中SchemaUpdate和SchemaExport之間的區別
- 26. UNIX中「./」和「sh」之間的區別
- 27. ZF2中InputFilterAwareInterface和InputFilterProviderInterface之間的區別
- 28. sshd_config中maxstartups和maxsessions之間的區別
- 29. 'OR'和'||'之間的區別在SQL中?
- 30. Weka中SimpleLogistic和Logistic之間的區別