Skip to content

Instantly share code, notes, and snippets.

@Yipee-ki-yay
Last active March 24, 2019 07:32
Show Gist options
  • Save Yipee-ki-yay/a5228e4deca1001214370c38053a3c16 to your computer and use it in GitHub Desktop.
Save Yipee-ki-yay/a5228e4deca1001214370c38053a3c16 to your computer and use it in GitHub Desktop.
Ожидаемые результаты при использовании классического наследования
// родительский конструктор
function Parent(name) {
this.name = name || 'Adam';
}
// добавление дополнительной функциональности в прототип
Parent.prototype.say = function() {
return this.name;
}
// пустой дочерний конструктор
function Child(name) {}
// здесь происходит магия наследования
inherit(Child, Parent);
/*
** Классический шаблон №1: шаблон по умолчанию
*/
function inherit (C, P) {
C.prototype = new P();
}
var kid = new Child();
kid.say(); // "Adam"
kid.name = "Patrick";
kid.say(); // "Patrick"
/*
** Классический шаблон № 2: Заимствование констуктора
*/
function Child(a, c, b, d) {
Parent.apply(this, arguments);
}
// родительский конструктор
function Article () {
this.tags = ['js', 'css'];
}
var article = new Article();
// объект сообщения в блоге наследует свойства объекта article
// через классический шаблон № 1
function BlogPost() {}
BlogPost.prototype = article;
var blog = new BlogPost();
// обратите внимание, что выше нет необходимости использовать
// выражение 'new Article()',
// потому что уже имеется доступный экземпляр
// статическая страница наследует свойства объекта article
// через шаблон заимствования конструктора
function StaticPage () {
Article.call(this, arguments)
}
var page = new StaticPage();
console.log(article.hasOwnProperty('tags')); // true
console.log(blog.hasOwnProperty('tags')); // false
console.log(page.hasOwnProperty('tags')); // true
/* Множественное наследование при заимствовании конструктора */
function Cat() {
this.legs = 4;
this.say = function() {
return 'meooowww';
}
}
function Bird() {
this.wings = 2;
this.fly = true;
}
function CatWings() {
Cat.apply(this, arguments);
Bird.apply(this, arguments);
}
var jane = new CatWings();
console.dir(jane);
/*
** Классический шаблон № 3: Заимствование и установка прототипа
*/
function Child(a, c, b, d) {
Parent.apply(this, arguments);
}
Child.prototype = new Parent();
// родительский конструктор
function Parent(name) {
this.name = name || 'Adam';
}
// добавление дополнительной функ-сти в прототип
Parent.prototype.say = function() {
return this.name;
};
// дочерний конструктор
function Child(name) {
Parent.apply(this. arguments);
}
Child.prototype = new Parent();
var kid = new Child("Patrick");
kid.name; // "Patrick"
kid.say(); // "Patrick"
delete kid.name;
kid.say(); // Adam
/*
** Классический шаблон №4: совместное использование прототипа
*/
// Доступ к повторно используемым членам обеспечивается прототипом, а не ссылкой this.
// То есть все что должно наследоваться, должно находиться в родительском прототипе.
// В этом случае достаточно просто присвоить родительский прототип дочернему.
function inherit (C, P) {
C.prototype = new P();
}
/*
** Классический шаблон №5: временный конструктор
*/
function inherit(C, P) {
var F = function() {};
F.prototype = P.prototype;
C.prototype = new F();
// сохранение суперкласса
C.uber = P.prototype;
// установка указателя на конструктор
C.prototype.constructor = C;
}
// Нет необходимости создавать временный(промежуточный) конструктор всякий
// раз, когда потребуется организовать наследование. Вполне достаточно
// создать его однажды и просто изменять его свойство prototype
var inherit = (function () {
var F = function() {};
return function(C, P) {
F.prototype = P.prototype;
C.prototype = new F();
// сохранение суперкласса
C.uber = P.prototype;
// установка указателя на конструктор
C.prototype.constructor = C;
}
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment