2012-07-15 26 views
12

Tôi đã chơi xung quanh với JavaScript đặc biệt mô phỏng lập trình hướng đối tượng với các lớp và không có gì.Sao chép mẫu thử nghiệm để kế thừa?

tôi biết về cách này để đạt được thừa kế

MyClass.prototype = new AnotherClass(); 

Nhưng tôi đã không hài lòng, tôi không thích làm thế nào tôi cần phải gọi constructor của AnotherClass. Vì vậy, tôi đã được chơi xung quanh và tôi đã đưa ra một cái gì đó mà dường như làm việc và về cơ bản muốn có một ý kiến ​​thứ hai.

function clone (obj) 
{ 
    function CloneFactory() {} 
    CloneFactory.prototype = obj; 

    return new CloneFactory(); 
} 

MyClass.prototype = clone(AnotherClass.prototype); 

Bằng cách nhân bản nguyên mẫu chúng tôi nhận được một bản sao mới của nó và gán đó để nguyên mẫu MyClass 's để thay đổi các thuộc tính kế thừa sẽ không ảnh hưởng đến tính nguyên mẫu của của cha mẹ. Như thế này sẽ là MyClass.prototype = AnotherClass.prototype.

Tôi chạy kiểm tra căng thẳng và điều này hiệu quả hơn trong một số trường hợp nhất định, tức là khi có nhiều mã trong hàm tạo của cha mẹ, nếu không thì nó giống nhau. Một lợi ích khác (hoặc ít nhất là tôi thấy nó có lợi) là nó cho phép ẩn thông tin ở mức độ nào đó khỏi các lớp con. Bất kỳ phương pháp và thành viên đặc quyền nào sẽ KHÔNG được kế thừa.

Có một số lỗ hổng lớn mà tôi đang xem không?

Tôi không phải là chuyên gia có JavaScript, thực ra tôi khá mới với JavaScript, vì vậy tôi muốn có ý kiến ​​thứ hai về điều này vì tôi dường như không tìm thấy bất kỳ điều gì thông qua Google. Tôi không muốn triển khai mã xấu :)!

Trả lời

17

Đây là gần như chính xác những gì Object.create làm. Hàm bạn đã viết là một "polyfill" khá chuẩn cho phương thức đó.

Đây là cách thực sự phổ biến để trừu tượng hóa việc tạo đối tượng theo cách phản ánh chính xác hơn "thừa kế" nguyên mẫu. Chắc chắn là một cách an toàn để làm việc.

Oh, và đây là một liên kết đến các mục MDN cho Object.create, nếu bạn quan tâm: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/create/

Bạn sẽ nhận thấy ở phía dưới rằng họ thực sự bao gồm các polyfill, đó là khá nhiều giống với mã của bạn , lưu một số kiểm tra an toàn và tên biến.

+0

Cảm ơn! Tôi thậm chí không biết về 'Object.create' cho đến bây giờ. – SpaceFace

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