Last active
March 24, 2019 07:32
-
-
Save Yipee-ki-yay/a5228e4deca1001214370c38053a3c16 to your computer and use it in GitHub Desktop.
Ожидаемые результаты при использовании классического наследования
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// родительский конструктор | |
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