2009-11-28 27 views
5

có cách nào trong JavaScript để kế thừa các thành viên riêng tư từ một lớp cơ sở đến một lớp con không?Làm cách nào để kế thừa thành viên riêng tư trong JavaScript?

tôi muốn đạt được một cái gì đó như thế này:

function BaseClass() { 
    var privateProperty = "private"; 

    this.publicProperty = "public"; 
} 

SubClass.prototype = new BaseClass(); 
SubClass.prototype.constructor = SubClass; 

function SubClass() { 
    alert(this.publicProperty); // This works perfectly well 

    alert(this.privateProperty); // This doesn't work, because the property is not inherited 
} 

Làm thế nào tôi có thể đạt được một mô phỏng đẳng cấp như thế nào, như thế nào trong oop-ngôn ngữ khác (ví dụ như C++.), Nơi tôi có thể kế thừa tư tài sản (bảo vệ)?

Cảm ơn bạn, David Schreiber

+0

Mẫu này không thêm thuộc tính riêng tư. Nó chỉ thêm một biến cục bộ được gọi là privateProperty trong hàm BaseClass. – erikkallen

+1

xem http://stackoverflow.com/questions/1437712/how-to-override-private-variable-in-javascript/1438592#1438592 cho ý kiến ​​của tôi về việc khơi gợi ngôn ngữ như vậy; tìm hiểu ngữ nghĩa của JS thay vì cố gắng mô phỏng C++ – Christoph

Trả lời

11

Sử dụng Douglas Crockfords power constructor pattern (liên kết là một video), bạn có thể đạt được các biến được bảo vệ như sau:

function baseclass(secret) { 
    secret = secret || {}; 
    secret.privateProperty = "private"; 
    return { 
     publicProperty: "public" 
    }; 
} 

function subclass() { 
    var secret = {}, self = baseclass(secret); 
    alert(self.publicProperty); 
    alert(secret.privateProperty); 
    return self; 
} 

Lưu ý: Với mẫu hàm tạo, bạn không sử dụng new. Thay vào đó, chỉ cần nói var new_object = subclass();.

+0

Cảm ơn bạn rất nhiều! Liên kết đến video mẫu của nhà xây dựng điện đã giúp tôi rất nhiều. Đây chính xác là những gì tôi đang tìm kiếm. Bây giờ tôi hiểu rằng có nhiều hơn nữa cho tôi để tìm hiểu về JS và các đối tượng :-) –

+1

Liên kết đã thay đổi; đây là cái mới: http://www.yuiblog.com/blog/2006/11/27/video-crockford-advjs/ (Liên kết ban đầu là phần 1) –

+1

Không nên là 'secret.privateProperty' 'secret.protectedProperty' và sau đó riêng tư sẽ giống như' var privateProperty'? – sabgenton

0

Điều này là không thể. Và đó không thực sự là một thuộc tính riêng tư - nó chỉ đơn giản là một biến thông thường chỉ có sẵn trong phạm vi mà nó được xác định.

0

Điều đó không thể được thực hiện, nhưng bạn có thể xóa các tài sản từ nguyên mẫu lớp để nó không được thừa hưởng:

SubClass.prototype.privateProperty = undefined; 

Bằng cách đó nó sẽ không được thừa hưởng, nhưng bạn cần phải làm điều đó cho mọi thuộc tính "riêng tư" trong lớp cơ sở của bạn.

2

Đánh dấu của bạn tin biến với một số loại đánh dấu như một dấu gạch dưới hàng đầu _ Bằng cách này bạn biết đó là một biến riêng (mặc dù về mặt kỹ thuật nó không phải là)

this._privateProperty = "private"; 
alert(this._privateProperty) 
Các vấn đề liên quan