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
.