Как унаследовать приватный член в JavaScript?
-
06-07-2019 - |
Вопрос
есть ли в 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 ++), где я могу наследовать частные (защищенные) свойства?
Спасибо, Дэвид Шрайбер
Решение
Используя шаблон конструктора мощности Дугласа Крокфордса (ссылка на видео), вы можете получить защищенные переменные, как это:
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 ();
.
Другие советы
Пометьте свои закрытые переменные с помощью некоторой разметки, например, нижнего подчеркивания _ Таким образом, вы знаете, что это закрытая переменная (хотя технически это не так)
this._privateProperty = "private";
alert( this._privateProperty )
Это невозможно. И это на самом деле не частное свойство - это просто обычная переменная, доступная только в той области, в которой она была определена. Р>
Этого нельзя сделать, но вы можете удалить свойство из прототипа класса, чтобы оно не было унаследовано:
SubClass.prototype.privateProperty = undefined;
Таким образом, он не будет наследоваться, но вы должны делать это для каждого " частного " недвижимость в вашем базовом классе.