Я предпочитаю использовать функциональный стиль ООП для своего кода (подобный шаблону модуля), потому что он помогает мне избежать "нового" ключевого слова и всех проблем с объемом "этого" ключевого слова в обратных вызовах.
Но я столкнулся с несколькими незначительными проблемами с ним. Я хотел бы использовать следующий код для создания класса.
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;
}
Править. Для тех, кто спросил, что является причинами выбора этого стиля ООП, можно изучить следующие вопросы:
Я согласен почти со всеми комментариями или ответами, предоставленными до сих пор, но чтобы продвинуть ответ Тима на один шаг дальше - он спросил, почему вы хотите вызвать метод до того, как он будет определен, но все равно предложил решение, в то время как я бы посоветовал вам не следует вызывать до определения (я не знаю ни одного языка, где вызов метода до определения или, по крайней мере, объявление его считается хорошей практикой), так что как насчет этого, как насчет этого?
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;
}
Есть ли конкретная причина, по которой это не сработает?
У меня возникает несколько вопросов, например, почему вы хотите избежать оператора 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;
}
Это решение, о котором я упоминал в вопросе. Ваши комментарии приветствуются.
namespace.myClass = function(){
var self = {},
somePrivateVar1;
function init(){
privateMethod();
self.publicMethod();
}
function privateMethod(){}
self.publicMethod = function(){};
init();
return self;
}
Вы можете использовать библиотеку Zet.js, которая поможет вам объявить классы так, как вы хотите.