Могут ли классы / объекты JavaScript иметь конструкторы? Как они созданы?
javascript
oop
Нажмите Upvote
источник
источник
Ответы:
Использование прототипов:
Сокрытие «color» (несколько напоминает приватную переменную-член):
Применение:
источник
color
. Я бы предположил, что вы используете в значительной степени зависит от личных предпочтений (защита против простоты)var
делает приватную переменную.this
делает публичную переменнуюFoo
, тогда как в последнем случае она будет знать, что онаFoo
вызывается. Очень полезно для отладки.Вот шаблон, который я иногда использую для ООП-подобного поведения в JavaScript. Как видите, вы можете моделировать частные (как статические, так и экземпляры) члены, используя замыкания. То,
new MyClass()
что вернётся, это объект с только свойствами, назначеннымиthis
объекту иprototype
объекту «класса».Меня спросили о наследовании с использованием этого шаблона, поэтому здесь идет:
И пример, чтобы использовать все это:
Как видите, классы корректно взаимодействуют друг с другом (они используют статический идентификатор
MyClass
,announce
метод использует правильныйget_name
метод и т. Д.)Стоит отметить, что необходимо скрывать свойства экземпляра. Вы можете заставить
inherit
функцию пройти через все свойства экземпляра (используяhasOwnProperty
), которые являются функциями, и автоматически добавитьsuper_<method name>
свойство. Это позволит вам вызыватьthis.super_get_name()
вместо того, чтобы хранить его во временном значении и называть его связанным с помощьюcall
.Для методов в прототипе вам не нужно беспокоиться о вышеупомянутом, хотя, если вы хотите получить доступ к методам прототипа суперкласса, вы можете просто вызвать
this.constructor.super.prototype.methodName
. Если вы хотите сделать его менее подробным, вы, конечно, можете добавить удобные свойства. :)источник
cls.prototype
части: «общий доступ к экземплярам» предназначен только для чтения значения (вызоваannounce
). Если вы установитеmyClassInstance.announce
другое значение, оно создаст новое свойствоmyClassInstance
, поэтому оно будет применяться только к этому объекту, а не к другим экземплярам класса. НазначениеMyClass.prototype.announce
будет влиять на все экземпляры, хотя.MyClass.get_nextId()
Мне кажется, что большинство из вас приводит пример геттеров и сеттеров, а не конструктор, т.е. http://en.wikipedia.org/wiki/Constructor_(object-oriented_programming) .
Ланч-дан был ближе, но пример не работал в jsFiddle.
В этом примере создается функция частного конструктора, которая запускается только во время создания объекта.
Если вы хотите назначить открытые свойства, тогда конструктор можно определить так:
источник
Box()
функция :). Но этот пример, а также примеры в других ответах могут быть легко расширены для принятия параметров.Box
функции, и вы готовы (это все еще "личное"). «Приватный» в Javascript означает просто доступ через лексическую область; нет необходимости назначать членам. Дополнительно: этот код неверен. Это создает глобальную__construct
переменную, что довольно плохо.var
следует использовать для ограничения сферы действия__construct
.Смысл свойства конструктора состоит в том, чтобы обеспечить некоторый способ притворяться, что JavaScript имеет классы. Одна из вещей, которую вы не можете использовать , это изменить конструктор объекта после его создания. Это сложно.
Я написал довольно обширную статью об этом несколько лет назад: http://joost.zeekat.nl/constructors-considered-mildly-confusing.html
источник
Пример здесь: http://jsfiddle.net/FZ5nC/
Попробуйте этот шаблон:
Вы должны настроить свое пространство имен, если вы определяете статический класс:
Пример класса:
Пример реализации:
Функции уведомления определяются как AB = function A_B (). Это должно облегчить отладку вашего скрипта. Откройте панель проверки элемента Chrome, запустите этот скрипт и разверните трассировку отладки:
источник
Это конструктор:
Когда вы делаете
MyClass
выполняется, и новый объект возвращается из этого класса.источник
alert(valuePassedInAsArgument);
и это будет выполняться один раз для каждого экземпляра, поэтому весь класс является самим конструктором.new object is returned of that class
- разве это не похоже на возвращение нового объекта этой функции?Я нашел этот урок очень полезным. Этот подход используется большинством плагинов jQuery.
http://www.htmlgoodies.com/html5/tutorials/create-an-object-oriented-javascript-class-constructor.html#fbid=OVYAQL_TDpK
Сейчас же ,
источник
klass
Эта модель хорошо послужила мне. С помощью этого шаблона вы создаете классы в отдельных файлах, загружая их в ваше общее приложение «по мере необходимости».
источник
var
в конструкторе (или аргумент функции, или в функции, подобной конструктору).Да, вы можете определить конструктор внутри объявления класса следующим образом:
источник
Я предполагаю, что я отправлю то, что я делаю с закрытием javascript, так как никто еще не использует закрытие.
Комментарии и предложения к этому решению приветствуются. :)
источник
Используя приведенный выше пример Ника, вы можете создать конструктор для объектов без параметров, используя оператор return в качестве последнего оператора в определении вашего объекта. Верните функцию конструктора, как показано ниже, и она будет запускать код в __construct при каждом создании объекта:
источник
this.getColor();
в строке выше,alert("Object Created.");
ничего не будет предупреждено. Там будет ошибка, как «getColor не определен». Если вы хотите, чтобы конструктор мог вызывать другие методы объекта, он должен быть определен после всех других методов. Поэтому вместо вызова__construct();
последней строки просто определите конструкцию там и поставьте()
после нее, чтобы принудительно выполнить ее автоматически.()
в конец определения __construct все равно привело к ошибке. Мне пришлось звонить__construct();
по собственной линии, как в оригинальном коде, чтобы избежать ошибки.Может быть, это стало немного проще, но вот то, что я придумал сейчас в 2017 году:
При использовании класса выше, у меня есть следующее:
Как видите, конструктор принимает два параметра, и мы устанавливаем свойства объекта. Мы также изменяем цвет и форму объекта, используя
setter
функции, и докажем, что его изменение осталось после вызоваgetInfo()
после этих изменений.Немного поздно, но я надеюсь, что это поможет. Я проверил это с помощью
mocha
юнит-тестирования, и оно работает хорошо.источник
Они делают, если вы используете Typescript - с открытым исходным кодом от MicroSoft :-)
Typescript позволяет вам «подделывать» OO-конструкции, которые скомпилированы в javascript-конструкции. Если вы начинаете большой проект, он может сэкономить вам много времени, и он только что достиг версии milestone 1.0.
http://www.typescriptlang.org/Content/TypeScript%20Language%20Specification.pdf
Приведенный выше код «скомпилирован» для:
источник
В JavaScript тип вызова определяет поведение функции:
func()
obj.func()
new func()
func.call()
илиfunc.apply()
Функция вызывается как конструктор при вызове с использованием
new
оператора:Любой экземпляр или прототип объекта в JavaScript имеет свойство
constructor
, которое ссылается на функцию конструктора.Проверьте этот пост о свойстве конструктора.
источник
При использовании большого шаблона Blixt, описанного выше, я обнаружил, что он не очень хорошо работает с многоуровневым наследованием (MyGrandChildClass, расширяющий MyChildClass, расширяющий MyClass) - он циклически вызывает конструктор первого родителя снова и снова. Итак, вот простой обходной путь - если вам нужно многоуровневое наследование, вместо использования
this.constructor.super.call(this, surName);
usechainSuper(this).call(this, surName);
с функцией chain, определенной следующим образом:источник
http://www.jsoops.net/ достаточно хорош для упс в Js. Если предоставить частную, защищенную, публичную переменную и функцию, а также функцию наследования. Пример кода:
источник
просто чтобы предложить немного разнообразия. ds.oop - это хороший способ объявить классы с конструкторами в javascript. Он поддерживает все возможные типы наследования (включая 1 тип, который даже не поддерживает c #), а также интерфейсы, что приятно.
источник
Здесь мы должны обратить внимание на один момент в java-скрипте: это язык без классов, однако мы можем достичь этого, используя функции в java-скрипте. Наиболее распространенный способ достижения этого - создать функцию в сценарии java, использовать новое ключевое слово для создания объекта и использовать это ключевое слово для определения свойства и методов. Ниже приведен пример.
источник
В большинстве случаев вам нужно как-то объявить необходимое свойство, прежде чем вы сможете вызвать метод, передающий эту информацию. Если вам не нужно изначально устанавливать свойство, вы можете просто вызвать метод внутри объекта следующим образом. Вероятно, не самый красивый способ сделать это, но это все еще работает.
источник