Недавно я увидел следующий код, который создает класс в JavaScript:Вопрос о конкретной схеме определения класса Javascript
var Model.Foo = function(){
// private stuff
var a, b;
// public properties
this.attr1 = '';
this.attr2 = '';
if(typeof Model.Foo._init === 'undefined'){
Model.Foo.prototype = {
func1 : function(){ //...},
func2 : function(){ //... },
//other prototype functions
}
}
Model.Foo._init = true;
}
// Instantiate and use the class as follows:
var foo = new Model.Foo(); foo.func1();
Я предполагаю, что переменная _init используются, чтобы убедиться, что мы не определяем прототип снова , Кроме того, я считаю, что код более читабельен, так как я помещаю все в функциональный блок (так что в oop-talk все атрибуты и методы находятся в одном месте). Вы видите какие-либо проблемы с кодом выше? Любые подводные камни использования этого шаблона, если мне нужно создать много классов в большом проекте?
Итак, я подумал, что проще использовать частные атрибуты в прототипах функций (с закрытием). Как бы вы предложили использовать частный аут? Что-то вроде 'this.func() {alert (a);}' внутри функции класса? Почему бы вам не использовать private attr в прототипах? – fenderplayer
Я бы не использовал частные атрибуты или параметры для конструктора в методе прототипа, потому что они являются особыми для создаваемого экземпляра, тогда как методы прототипа будут применяться ко всем экземплярам. Тогда первый вызов Model.Foo() будет иметь некоторый уникальный эффект, кажется, трудно поддерживать. –
С Javascript я действительно не скрываю рядовых. Я забываю, что выталкивание элементов прототипа из функционального блока, запрещая частные переменные. Я решил, что смогу жить с этим. Если вы не можете жить с этим, вы должны поместить функции внутри конструктора. Но не прикрепляйте их к прототипу так, как вы, потому что тогда эти частные переменные больше не являются переменными для каждого экземпляра, а скорее разделяются между экземплярами. –