Вопрос о функциональном ООП разрабатывает в JavaScript

Я предпочитаю использовать функциональный стиль ООП для своего кода (подобный шаблону модуля), потому что он помогает мне избежать "нового" ключевого слова и всех проблем с объемом "этого" ключевого слова в обратных вызовах.

Но я столкнулся с несколькими незначительными проблемами с ним. Я хотел бы использовать следующий код для создания класса.

namespace.myClass = function(){
  var self = {},
      somePrivateVar1;

  // initialization code that would call
  // private or public methods
  privateMethod();
  self.publicMethod(); // sorry, error here

  function privateMethod(){}

  self.publicMethod = function(){};

  return self;
}

Проблема состоит в том, что я не могу назвать открытые методы из своего кода инициализации, поскольку эти функции еще не определяются. Очевидное решение состояло бы в том, чтобы создать init метод и назвать его перед "возврат сам" строка. Но возможно Вы знаете более изящное решение?

Кроме того, как Вы обычно обрабатываете наследование с этим шаблоном? Я использую следующий код, butI хотел бы услышать Ваши идеи и предложения.

namespace.myClass2 = function(){
  var self = namespace.parentClass(),
      somePrivateVar1;            

  var superMethod = self.someMethod;
  self.someMethod = function(){
    // example shows how to overwrite parent methods
    superMethod();
  };

  return self;
}

Править. Для тех, кто спросил, что является причинами выбора этого стиля ООП, можно изучить следующие вопросы:

5
задан Community 23 May 2017 в 10:34
поделиться

4 ответа

Я согласен почти со всеми комментариями или ответами, предоставленными до сих пор, но чтобы продвинуть ответ Тима на один шаг дальше - он спросил, почему вы хотите вызвать метод до того, как он будет определен, но все равно предложил решение, в то время как я бы посоветовал вам не следует вызывать до определения (я не знаю ни одного языка, где вызов метода до определения или, по крайней мере, объявление его считается хорошей практикой), так что как насчет этого, как насчет этого?

namespace.myClass = function(){  
  //declare private vars (and self) first
  var self = {},  
      somePrivateVar1;  

  //then declare private methods
  function privateMethod(){}  

  //then public/privileged methods
  self.publicMethod = function(){};  

  // THEN (and only then) add your 
  // initialization code that would call  
  // private or public methods  
  privateMethod();  
  self.publicMethod(); // no error any more

  //then return the new object
  return self;  
} 

Есть ли конкретная причина, по которой это не сработает?

0
ответ дан 15 December 2019 в 06:27
поделиться

У меня возникает несколько вопросов, например, почему вы хотите избежать оператора new, и почему вы хотите вызвать функции до того, как они будут определены. Однако, если оставить их в стороне, как насчет чего-то более похожего на следующее?

namespace.myClass = function(){
  var somePrivateVar1;
  var self = {};

  // initialization code that would call
  // private or public methods
  privateMethod();
  publicMethod();

  function privateMethod(){}
  function publicMethod(){}

  self.publicMethod = publicMethod;
  return self;
}
1
ответ дан 15 December 2019 в 06:27
поделиться

Это решение, о котором я упоминал в вопросе. Ваши комментарии приветствуются.

namespace.myClass = function(){
  var self = {},
      somePrivateVar1;

  function init(){
    privateMethod();
    self.publicMethod();
  }

  function privateMethod(){}
  self.publicMethod = function(){};

  init();
  return self;
}
0
ответ дан 15 December 2019 в 06:27
поделиться

Вы можете использовать библиотеку Zet.js, которая поможет вам объявить классы так, как вы хотите.

2
ответ дан 15 December 2019 в 06:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: