2013-05-31 9 views
6

Tôi đã theo mô hìnhJS mô-đun mô hình override chức năng

BASE = function() { 
    var that = {}; 
    var number = 10; 

    that.showNumber = function(){ 
     that.alertNumber(); 
    } 

    that.alertNumber = function() { 
     alert(number); 
    };  
    return that; 
}; 

CHILD = function() { 
    var that = Object.create(BASE()); 
    var secondNumber = 20; 

    // Override base function 
    that.alertNumber = function() { 
     alert(secondNumber); 
    }; 
    return that; 
}; 

var ch = CHILD(); 
ch.showNumber(); 

Bạn có thể cho tôi biết làm thế nào tôi có thể điều chỉnh kiểu mô-đun của tôi lấy cảm hứng từ Douglas Crockford để ghi đè hoàn toàn alerNumber chức năng? Cho đến nay showNumber chức năng hiển thị 10 thay vì 20.

Cảm ơn tất cả các bạn ở cao cấp

JSFiddle với mã là here

+0

Tại sao không chỉ sử dụng mẫu thử nghiệm? Điều này sẽ làm cho nó đơn giản. –

+0

Tại sao không viết var = new BASE(); ? – frenchie

+0

Mẫu này cho phép nhiều thừa kế –

Trả lời

5

Bạn có thể thay đổi

that.showNumber = function(){ 
    that.alertNumber(); 
} 

để

that.showNumber = function(){ 
    this.alertNumber(); 
} 

Nhưng tôi không chắc tôi thấy y bạn không chỉ đơn giản sử dụng the prototype-base inheritance model.

+0

Đó là điều mà tôi không hiểu đầy đủ. Tại sao 'this.alertNumber()' trong cơ sở được tham chiếu đến 'đó' trong lớp' Base'? –

+0

Mẫu này bạn sử dụng đặt biến 'that' trong phần đóng để đảm bảo hàm showNumber đang sử dụng cá thể được định nghĩa trong hàm tạo, do đó làm cho các lược đồ kế thừa tiên tiến nhất không hoạt động (ví dụ: hàm superclass gọi hàm khác và cho phép nó ghi đè). –

+0

OK vì vậy nếu tôi nhận được nó tốt, khi tôi muốn để có thể ghi đè lên chức năng phụ huynh tôi phải sử dụng mô hình khác nhau? Tôi xin lỗi vì một câu hỏi khó hiểu như vậy, nhưng tôi chỉ có kinh nghiệm với Java, nơi thừa kế hoàn toàn khác. –