2012-05-21 30 views

Trả lời

23

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 BA.

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:

  1. Tất cả các phím được tìm thấy trực tiếp trên parent được đặt trên child.
  2. 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ẹ.
  3. Lớp trẻ em prototype được đặt thành phiên bản ctor. ctor 's constructor sẽ được đặt thành child và chính mẫu thử nghiệm của ctorparent.
  4. Thuộc tính __super__ của lớp con được đặt thành parent 's prototype, để sử dụng bởi từ khóa super 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.

Các vấn đề liên quan