Вопрос

есть ли в 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;

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top