2009-11-28 5 views
5

Есть ли способ в JavaScript для наследования частных членов из базового класса в подкласс?Как наследовать частный член в JavaScript?

Я хочу, чтобы достичь чего-то вроде этого:

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 
} 

Как можно достичь класса, как моделирование, как и в других Oop-языков (например, C++.), Где я могу наследовать частные (защищенные) свойства?

Спасибо, Дэвид Schreiber

+0

Этот шаблон не добавляет частной собственности. Он только добавляет локальную переменную privateProperty в функцию BaseClass. – erikkallen

+1

см. Http://stackoverflow.com/questions/1437712/how-to-override-private-variable-in-javascript/1438592#1438592 за мое мнение о подобной языковой бастардонизации; изучите семантику JS вместо того, чтобы пытаться подражать C++ – Christoph

ответ

11

Использование Douglas Crockfords power constructor pattern (ссылки на видео), вы можете достичь защищенные переменные, как это:

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; 
} 

Примечание: с помощью шаблона конструктора питания, вы не используете new. Вместо этого просто скажите var new_object = subclass();.

+0

Большое вам спасибо! Мне очень понравилась ссылка на видеоролик с шаблоном конструкции. Это именно то, что я искал. Теперь я понимаю, что мне гораздо больше узнать о JS и объектах :-) –

+1

Ссылка изменилась; вот новый: http://www.yuiblog.com/blog/2006/11/27/video-crockford-advjs/ (Исходная ссылка была в 1) –

+1

Не нужно 'secret.privateProperty' быть 'secret.protectedProperty', а затем private будет что-то вроде' var privateProperty'? – sabgenton

0

Это не представляется возможным. И это не частная собственность - это просто регулярная переменная, доступная только в области, в которой она была определена.

0

Это не может быть сделано, но вы можете удалить свойство из класса прототипа, так что он не передается по наследству:

SubClass.prototype.privateProperty = undefined; 

Таким образом, он не будет наследоваться, но вы должны сделать это для каждого «частного» имущества в вашем базовом классе.

2

Марка ваших частных переменных с каким-то разметкой, как ведущее подчеркивание _ Таким образом, вы знаете, что это приватное переменная (хотя технически это не)

this._privateProperty = "private"; 
alert(this._privateProperty) 
Смежные вопросы