2012-11-07 38 views
10

Có 2 cách để gọi hàm tạo cha mẹ trong phần tử con.Trình tạo cơ sở gọi điện - Javascript

var A = function A() { 
    this.x = 123; 
}; 

var B = function B() { 

    // 1. call directly 
    A.call(this); 

    // 2. call from prototype 
    A.prototype.constructor.call(this); 
}; 

B.prototype = Object.create(A.prototype); 
B.prototype.constructor = B; 

Có bất kỳ trường hợp nào khi an toàn hơn/tốt hơn hoặc khác nhau không?

+0

Điều gì sẽ buộc bạn phải sử dụng phiên bản thứ hai? Bạn chỉ cần đi một con đường dài để có được chức năng tương tự. –

+0

Có thể một tình huống mà 'A' được thừa hưởng một hàm tạo từ một đối tượng khác? –

+0

Được rồi, nhưng sau đó hai cuộc gọi không tương đương. Bạn đang nói về hai tình huống khác nhau. –

Trả lời

15

Đó là luôn luôn tốt hơn để sử dụng các nhà xây dựng cơ sở trực tiếp vì những lý do sau đây:

  1. Đó là nhanh hơn. Người phiên dịch không cần truy cập prototype.constructor.
  2. Đó là an toàn hơn. Hãy xem xét chương trình dưới đây.

A thừa hưởng từ C, nhưng tôi quên để thiết lập A.prototype.constructor trở lại A. Vì vậy, nó bây giờ trỏ đến C. Điều này gây ra sự cố trong hàm dựng B nếu chúng tôi sử dụng phương pháp thứ hai:

var C = function C() { 
    // some code 
}; 

var A = function A() { 
    this.x = 123; 
}; 

A.prototype = Object.create(C.prototype); 
// I forgot to uncomment the next line: 
// A.prototype.constructor = A; 

var B = function B() { 

    // 1. call directly 
    A.call(this); 

    // 2. call from prototype 
    A.prototype.constructor.call(this); // A.prototype.constructor is C, not A 
}; 

B.prototype = Object.create(A.prototype); 
B.prototype.constructor = B; 
Các vấn đề liên quan