Наследование родительской функции 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;
}
всё гуд. Но где примеры использования кода? Да и пояснения по extendDeep не мешало б добавить.
ОтветитьУдалитьДобавьте примеры и будет 5 баллов!!!