Gần đây tôi đang học Node.js. Tôi có câu hỏi về hàm util.inherits
trong Node.js. Tôi có thể sử dụng extends
trong coffeescript để thay thế không? Nếu không, sự khác nhau giữa chúng là gì?Sự khác biệt giữa 'mở rộng' trong coffeescript và 'util.inherits' trong node.js
Trả lời
Có, bạn có thể sử dụng extends
thay cho vị trí đó.
Còn về sự khác biệt? Hãy bắt đầu với một cái nhìn tại CoffeeScript:
class B extends A
Hãy nhìn vào the JavaScript the CoffeeScript compiler produces cho JavaScript này:
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);
Vì vậy, __extends
được sử dụng để khai báo các mối quan hệ thừa kế giữa B
và A
.
Hãy trình bày lại __extends
hơn một chút readably, trong 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
(Bạn có thể kiểm tra rằng đây là một bản tái tạo chân bởi compiling it back to JavaScript.)
Dưới đây là những gì đang xảy ra:
- Tất cả các phím được tìm thấy trực tiếp trên
parent
được đặt trênchild
. - Một hàm tạo mẫu mới
ctor
được tạo, với các trường hợp 'constructor
thuộc tính được đặt cho trẻ em vàprototype
được đặt cho cha mẹ. - Lớp trẻ em
prototype
được đặt thành phiên bảnctor
.ctor
'sconstructor
sẽ được đặt thànhchild
và chính mẫu thử nghiệm củactor
làparent
. - Thuộc tính
__super__
của lớp con được đặt thànhparent
'sprototype
, để sử dụng bởi từ khóasuper
của CoffeeScript.
node's documentation mô tả util.inherits
như sau:
Kế thừa những phương pháp nguyên mẫu từ một nhà xây dựng thành khác. Nguyên mẫu của hàm tạo sẽ được đặt thành đối tượng mới được tạo từ superConstructor.
Để thuận tiện hơn, superConstructor sẽ có thể truy cập thông qua thuộc tính constructor.super_.
Kết luận, bạn không cần sử dụng util.inherits
nếu bạn đang sử dụng các lớp học của CoffeeScript; chỉ cần sử dụng các công cụ CS cung cấp cho bạn, và bạn nhận được tiền thưởng như từ khóa super
.
- 1. Sự khác biệt giữa socket.io và node.js
- 2. Sự khác biệt giữa việc mở rộng Hoạt động và mở rộng ListActivity là gì?
- 3. Sự khác biệt giữa các Mô-đun và phần mở rộng trong Yii
- 4. Sự khác biệt giữa Addin và VSPackage trong khả năng mở rộng của Visual Studio?
- 5. Sự khác biệt giữa Mở rộng ứng dụng và mở rộng hoạt động trong Android là gì?
- 6. Node.js: Sự khác biệt giữa req.query [] và req.params
- 7. Sự khác biệt giữa '.' và "." trong java
- 8. Sự khác biệt giữa. và: trong Lua
- 9. sự khác biệt giữa 'và "trong JavaScript?
- 10. Sự khác biệt giữa! và !! trong yaml?
- 11. Sự khác biệt giữa $ @ và $! trong perl
- 12. VowpalWabbit: Sự khác biệt và khả năng mở rộng
- 13. Sự khác biệt giữa typeof và instanceof trong JavaScript
- 14. Whats sự khác biệt giữa Run và Do trong Rx?
- 15. Sự khác biệt giữa. và #
- 16. sự khác biệt giữa các thành phần, mở rộng & module trong Yii
- 17. IIS 7 - Sự khác biệt giữa khả năng mở rộng .NET và ASP.NET
- 18. Sự khác biệt giữa phần mở rộng và plugin của Firefox là gì?
- 19. Sự khác biệt giữa $ (...) và `...`
- 20. Sự khác biệt giữa phần mở rộng tệp php và html là gì?
- 21. Sự khác biệt giữa = và: =
- 22. Sự khác biệt giữa $ * và $ @
- 23. Trong Ember.js, sự khác biệt giữa [] và Ember.A ([]) là gì?
- 24. Sự khác biệt giữa '&' và ',' trong Generics Java là gì?
- 25. Sự khác biệt giữa liệt kê <? mở rộng ZipEntry> và Enumeration <ZipEntry>?
- 26. Sự khác biệt giữa tiện ích mở rộng và mô-đun?
- 27. Sự khác biệt giữa ". +" Và ". +?"
- 28. Sự khác biệt giữa "**/* /" và "** /"?
- 29. Sự khác biệt giữa util.error và console.error trong Node.js là gì?
- 30. CoffeeScript: Mở rộng mảng trong gọi hàm