Открыть меню    

Объект в javascript, функция-конструктор и прототип

контент переехал из сниппетов в статьи

прототип в 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 работают только со строковыми свойствами, то есть, если свойство не указано как строка, то оно все равно станет строкой.
test test test

Комментарии к статье

аватарка пользователя
2014-11-24
Дмитрий

Зачем в самом верхнем коде создаются объекты opa и opa_, если они потом нигде не участвуют?
Ты забыл написать имя конструктора с заглавной буквы в example_constr(r,t) { ... }

аватарка пользователя
2014-11-24
dnzl

"Ты забыл написать имя конструктора с заглавной буквы" - ну это всего лишь рекомендация (чтобы код легче было различать), а не правило;