Вопрос

У меня есть определенный класс JavaScript:

var Welcomer = function(name) {
  var pName = name;
  var pMessage = function() {
    return "Hi, " + pName + "!";
  };

  return {
    sayHi: function() {
      alert(pMessage());
    }
  };
};

new Welcomer('Sue').sayHi();

Есть ли путь к «подклассу» Welcomer Таким образом, я могу переопределить общедоступные методы и иметь доступ к частным методам и переменным? Следующее даст мне доступ к публичным методам, но не частным:

var UnhappyWelcomer = function(name) {
  var pSadMessage = function() {
    // won't work, b/c I don't have access to pMessage
    return pMessage() + " Miserable day, innit?";
  };

  return {
    sayHi: function() {
      alert(pSadMessage());
    }
  };
};
UnhappyWelcomer.prototype = Welcomer(); // failed attempt at inheritance

new UnhappyWelcomer().sayHi();
Это было полезно?

Решение

Простой ответ на ваш вопрос Нет.

Вы не можете сделать что-нибудь, чтобы получить доступ к тем var определил вещи, если только ваша функция не в том же объеме, или вы как-то «обнародовать» информацию (возвращая ее или установив ее на this).

Если у вас есть доступ к редактированию оригинальной функции, вы можете переписать вещи таким образом, чтобы эти функции могли быть «пройдены» в расширяющуюся функцию, которая может изменить «защищенную» объем объекта. Следующий код должен дать хорошее представление о том, что я предлагаю.

var Welcomer = function(name) {
  var _protected = {
    name: name,
    message: function() {
      return "Hi, " + _protected.name + "!";
    }
  };

  return {
    extendWith: function(extender) {
      extender.call(this, _protected);
      return this;
    },
    sayHi: function() {
      alert(_protected.message());
    }
  };
};

var UnhappyWelcomer = function(name) {
  var self = Welcomer(name).extendWith(function(_protected) {
    _protected.sadMessage = function() {
       return _protected.message() + " Miserable day, innit?";
    };
    // extending the public while still having scope to _protected...
    this.sayHi = function() {
      alert(_protected.sadMessage());
    };
  });
  return self;
};

UnhappyWelcomer('bob').sayHi();

Другие советы

Эта модель «класса» не является шаблоном «класса», это известно как Модуль шаблона. Отказ Он возвращает объект, который не имеет связи с функцией, которая создала его, а затем наличие частных переменных. Возвращенный объект не является экземпляром функции, которая его создала.

Когда вы называете «новый класс ()», он создает экземпляр этой функции, но он также возвращает другой объект. Любые дополнительные операции на самом деле на возвращенном объекте и не экземпляра.

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

Дальнейшее чтение:

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

Как только вы узнаете больше по этому вопросу, вы, скорее всего, будут игнорировать частные члены AllTogether и использовать префикс _ и просто сделать его общественным членом, как все остальные;) Это просто проще, и частные члены бессмыслены в любом случае.

Если вам действительно нужно наследование, там есть некоторые библиотеки, которые помогут несно. Один вариант есть Trait.js., что на самом деле может стать стандартной частью JavaScript в любом случае. Если это не плавает на лодке, библиотеки, такие как jQuery и прототип, имеют помощники по наследству.

Если вы хотите пойти с минимальным подходом / от царапин, я настоятельно рекомендую вам использовать модель прототипа для всего. Вы увидите большое повышение производительности над узором, который у вас есть в ваших примерах.

Чтобы больше напрямую обратиться к вашему вопросу, нет. У вас будет проще времени, если вы разработаете ваши «классы», поэтому частные функции не полагаются.

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