Как программист C#, у меня есть что-то вроде привычки к созданию вещей, частных, который может и должен быть частным, и я всегда получаю странное чувство, когда тип JS выставляет все свои половые органы мне (и что чувство не 'пробуждено'). Скажите, что у меня есть тип, который имеет a draw
метод, который внутренне звонит drawBackground
и drawForeground
, которые не имеют никакого смысла быть названным самостоятельно. Как я должен реализовать это?
Опция 1
Foo = function(){
this.draw();
};
Foo.prototype.draw = function(){
this.drawBackground();
this.drawForeground();
};
Foo.prototype.drawBackground = function(){};
Foo.prototype.drawForeground = function(){};
Опция 2
Foo = (function(){
var constructor = function(){
this.draw();
};
var drawBackground = function(){};
var drawForeground = function(){};
constructor.prototype.draw = function(){
drawBackground.call(this);
drawForeground.call(this);
};
return constructor;
})();
Различие, конечно, будучи этим в первом примере, drawBackground
и drawForeground
методы являются частью общедоступного API, в то время как они скрыты к внешней стороне во второй. Это желательно? Какой я должен предпочесть? Разве я неправ применить свои привычки C# к JavaScript, и я должен сделать все расширяемым и сверхъездовым в JavaScript? И каковы последствия производительности .call(this)
?
Среди разработчиков Perl есть хорошо известная цитата из (не) известной книги Camel: «Модуль Perl предпочел бы, чтобы вы не выходили из его гостиной, потому что вас не пригласили, не потому, что у него есть дробовик ». Философия заключается в том, что если вы, как разработчик библиотеки, хотите различать публичный и частный API, это прекрасно. Сделайте это и задокументируйте. Вызывающий ваш код должен знать, что есть что, но он также может вести себя как идиот, если он решит и вызовет вещи, которые, по вашему мнению, им не следует называть.С точки зрения объектно-ориентированного программирования это еретично, но с языками сценариев они катятся именно так.
Ответ на этот вопрос несколько субъективен, но я скажу вам, что когда я пишу JavaScript и имею методы или переменные, которые были бы частными, если бы я кодировал в .NET, я просто добавляю к ним что-то вроде " prv_ "или" p_ "или просто" _ "... все, что плывет по вашей лодке. Таким образом, вы сказали своим пользователям, что эти данные должны быть конфиденциальными и могут измениться из-под них. И таким образом, если они все равно решат вызывать ваши частные методы, этот сомнительный код будет торчать, как больной палец.