Объект в javascript, функция-конструктор и прототип
контент переехал из сниппетов в статьи
При помощи оператора
new
можно создать объект (объект Function
).
За оператором new
необходимо указать имя функции-конструктора; данная функция-конструктор выполняет инициализацию свойств объекта.
В функцию-конструктор передается ключевое слово this
, которое ссылается на только что созданный объект.
Существуют встроенные конструкторы javascript, например: Array()
, Date()
, RegExp()
. Стоит отметить: конструктор Object()
создает пустой объект, что равнозначно использованию литерала объекта {}
.
Прототип – это значение свойства prototype
функции конструктора. Каждая функция имеет свойство prototype
, данное свойство ссылается на предопределенный объект-прототип. Этот объект работает только в том случае, если функция используется как конструктор, то есть совместно с оператором new.
Каждый объект имеет свойство constructor
; это свойство ссылается на функцию-конструктор, которая, как говорилось выше, выполняет инициализацию свойств объекта.
Как видите, свойство r_method
всегда ссылается на неизменяемую (в отличие от свойств, которые уникальны для каждого объекта) функцию. Поэтому рациональнее добавить ее к прототипу. Мы можем сделать простой вывод: объект-прототип подходящее место для констант и методов. Так как любой объект наследует свойства своего прототипа, то наша функция (r_method
) автоматически добавится всем объектам, инициализированным конструктором (example_constr
).
Классы javascript
Javascript не поддерживает классы как таковые. Однако вы можете создавать псевдоклассы, используя функции-конструкторы и прототипы объектов. Конструктор – это класс.
Назначение конструктора - создать новый объект, установить и возвратить его в качестве значения конструктора.
Имя конструктора обычно является существительным, пишется с прописной буквы и описывает конструируемый объект. Конструкторы, как правило, используют для создания объектов, соответствующих одному шаблону.
Пример создания объекта,
определение конструктора,
и установка свойства для прототипа:
javascript
// объект
var opa = {};
var opa_ = {x:0, y:"yes"}
var D = new Date(); // текущая дата
/* Свойство constructor */
document.write( D.constructor ); // function Date() { [native code] }
D.constructor == Date // true
// определяем конструктор:
function example_constr(r,t) {
this.ad = r;
this.ak = t;
// метод, но лучше определить как св-во прототипа
/* this.r_method = function ()
{
this.qu = this.ad - this.ak;
}*/
// метод, но внутри метода не используем свойства объекта
this.a_method = function (x,y)
{
alert(x+y);
}
}
// объявляем метод (r_method) в прототипе
// это предпочтительнее, чем использовать r_method в ф-и конструкторе
// по причине того, что ф-я r_method не имеет уникальных св-в, в отличие
// от вышеприведенных свойств (ad,ak)
example_constr.prototype.r_method = function ()
{
this.qu = this.ad - this.ak;
}
// вызываем конструктор и создаем объект example_constr (krot)
var krot = new example_constr(14,15);
// что равнозначно krot = {ad:14,ak:15}
krot.r_method();
// выведет:
//alert(krot.qu);
// -1
//krot.a_method(11,11);
// выведет:
// 22
Дополнение:
Чтобы создать собственный конструктор, достаточно описать функцию, в которой ключевое слово this
будет ссылаться на объекты (которые создаются посредством функции конструктора). Смотрите выше на примере example_constr
.
console.dir
js
console.dir(obj); // выведет все свойства объекта в консоли
Объекты в javascript позволяют воссоздать концепцию объектно-ориентированного программирования
Для того чтобы создавать объекты одного типа используют функции-конструкторы. Отличие конструктора от обычной функции в том, что конструктор вызывается через специальный оператор new
.
При использовании new
в функции-конструкторе return
может вернуть только объект, причем этот объект заменит возвращаемый по умолчанию объект this
.
Приватные переменные и функции
У функции-конструктора могут быть как приватные данные (такие данные внешний код может получить, но изменить не может), так и публичные.
javascript
// определяем конструктор:
function example_constr(r,t,name) {
// this = {} создается автоматически
this.ad = r;
this.ak = t;
this.a_method = function (x,y)
{
alert(x+y);
}
// функция-конструктор и без всякого return
// возвращает объект this
// приватная переменная (то есть из внешнего кода ее можно получить,
// но нельзя изменить):
this.getName = function(){
return name;
}
// также можно использовать обычные переменные,
// которые будут доступны в лишь пределах функции-конструктора:
var page,
password;
var ogo = function(){
//................
};
}
var newObj = new example_constr(1,2,"Вася");
console.dir(newObj);
console.log(newObj.getName()); //
знать
- ОБЪЕКТЫ javascript работают только со строковыми свойствами, то есть, если свойство не указано как строка, то оно все равно станет строкой.
Комментарии к статье
Зачем в самом верхнем коде создаются объекты opa и opa_, если они потом нигде не участвуют?
Ты забыл написать имя конструктора с заглавной буквы в example_constr(r,t) { ... }
"Ты забыл написать имя конструктора с заглавной буквы" - ну это всего лишь рекомендация (чтобы код легче было различать), а не правило;