2011-12-30 30 views
16

Tôi thích kiểu mô-đun mà trả về nhà xây dựng như mô tả trong: http://elegantcode.com/2011/02/15/basic-javascript-part-10-the-module-pattern/Kết hợp thừa kế với kiểu mô-đun

Tuy nhiên tôi không chắc chắn làm thế nào để kế thừa từ một đối tượng được thực hiện với mô hình này. Giả sử tôi có một đối tượng cha mẹ thực hiện như vậy ...

namespace('MINE'); 

MINE.parent = (function() { 
    // private funcs and vars here 

    // Public API - constructor 
    var Parent = function (coords) { 
     // ...do constructor stuff here 
    }; 

    // Public API - prototype 
    Parent.prototype = { 
     constructor: Parent, 
     func1: function() { ... }, 
     func2: function() { ... } 
    } 

    return Parent; 
}()); 

Làm thế nào để xác định một đối tượng trẻ em mà còn sử dụng kiểu mô-đun được thừa kế từ parent theo cách như vậy mà tôi có chọn lọc có thể ghi đè lên, ví dụ, func2?

+0

Chỉ cần một lưu ý, các mã bạn đã cung cấp có một lỗi - bạn đang thiết các nhà xây dựng cho 'undefined'. Tôi đã chỉnh sửa để sửa nó. – Langdon

+0

Tôi vừa hỏi một câu hỏi tương tự ở đây http://stackoverflow.com/questions/16659326/simple-javascript-inheritance-using-extend-and-module-pattern - tự hỏi bạn nghĩ gì về nó. –

Trả lời

16
MINE.child = (function() { 

    var Child = function (coords) { 
    Parent.call(this, arguments);  
    } 

    Child.prototype = Object.create(Parent.prototype); 

    Child.prototype.constructor = Child; 
    Child.prototype.func2 = function() { ... }; 

    return Child; 

}()); 
+1

Cảm ơn bạn. Đây là một câu trả lời rất rõ ràng và rõ ràng và làm việc tốt cho tôi. Tôi thích kiểu này vì nó bao gồm khởi tạo một lần, đóng gói và với mã của bạn ở trên, kế thừa. Bạn có thấy bất kỳ cạm bẫy lớn nào đối với mô hình không? –

+0

@AndrewS. Cá nhân tôi ghét không gian tên. Nhưng đó là một sở thích phong cách. Bạn có thể sử dụng trình nạp mô-đun để thay thế. – Raynos

+0

Điều này không hiệu quả đối với tôi. Nếu tôi khởi tạo một MINE.child, tôi không thể truy cập func1 (như được định nghĩa trong MINE.parent). Tui bỏ lỡ điều gì vậy?? Và func2 của trẻ có phải thay thế func2 của cha mẹ không? –

1

Tôi tìm giải pháp từ blog này (http://metaduck.com/08-module-pattern-inheritance.html) sạch hơn. Ví dụ:

function Parent(name) { 
    // Private variables here 
    var myName; 

    // Constructor 
    myName = name; 

    // Public interface 
    return { 
     func1: function() {alert("Parent func1. Name: " + myName); }, 
     func2: function() {alert("Parent func2. Name: " + myName); } 
    } 
} 

function Child(name) { 
    // Private variables here 
    var myName, 
     exportObj; 

    // Constructor 
    // Inherit 
    exportObj = Parent(name + "'s father"); 

    // Override 
    exportObj.func2 = function() { 
     alert("Child func2. Name: " + name); 
    } 

    // Export public interface 
    return exportObj; 
} 

Một ví dụ có thể chạy ở đây: http://jsfiddle.net/wt4wcuLc/

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