понедельник, 17 июня 2013 г.

JavaScript Наследование родительской функции init в потомке через apply. Функция классического наследования объектов через копирование.

Наследование родительской функции init в потомке через apply.

function Parent (name) {
    this.name = name || 'Adam';
}

function Child (name, surname) {
    Parent.apply(this, arguments);
    this.surname = surname;
}

Наследование родительского прототипа в потомке через prototype.

Parent.prototype.say = function() {console.log(this.name);};

Child.prototype = new Parent();

Если написать Child.prototype = Parent.prototype, то создастся просто ссылка-указатель на функцию родителя.
В результате изменение содержимого в Child.prototype будут изменять содержимое в Parent.prototype, что недопустимо.


4 этапа создания классичесого класса в JavaScript.

var MyClass = (function($){

    // Создаем функцию инициализатор - коструктор объектов.

    function Init(name) {
        this.name = name;
    }

    // Создаем частные и публичные методы.

    function private () {}
    function public () {}

    // Создаем методы класса и статичные методы.

    Init.static = function(){};

    // Делаем методы публичными через prototype.

    Init.prototype = {
        public: public
    };

    // Возвращаем функцию конструктор класса.

    return Init;

})(jQuery); // Выполнить то, что в скобках и вернуть функцию, создающую класс.

Наследование класса.

function extend (Parent, Child) {

     // Наследуем родительскую функцию инициализатор - коструктор объектов.

     Parent.apply(Child, arguments);

     // Наследуем методы класса и статичные методы родителя.

     Child.statuc = Parent.static;

     // Наследуем методы их prototype родителя.

     Child.prototype = new Parent();

    // Возвращаем функцию конструктор класса потомка.

    return Child;

}

Функция классического наследования. Создания объекта потомка, имеющего все свойства и методы объекта родителя.

function inherit(C, P) {
    function F () {}
    return function (C, P) {
        F.prototype = P.prototype;
        C.prototype = new F ();
        C.parent =  P.prototype;
        C.prototype.constructor = P;
    }
}

function P () {}
function C () {}

inherit (C, P);

Полное копирование свойств объекта типа массив или другой объект - это создание пустого массива или пустого объекта и копирование туда значений из родительского массива или объекта.

Таким образом в потомка копируются все свойства и методы родителя, поэтому изменение свойств и методов в потомке уже не влияет на родителя.

function extendDeep(C, P) {
    for (key in P) {
        if (P.hasOwnProperty(key)) {
            if (typeof P[key] === 'object') {
                C[key] = Object.prototype.toString.call(P[key]) === '[object Array]' ? [] : {};
                extendDeep(C[key], P[key]);
            } else {
                C[key] = P[key];
 
            }
        }
    }
    return C;
}

1 комментарий:

  1. всё гуд. Но где примеры использования кода? Да и пояснения по extendDeep не мешало б добавить.
    Добавьте примеры и будет 5 баллов!!!

    ОтветитьУдалить