Skip to content

Instantly share code, notes, and snippets.

@koyta
Created May 25, 2017 10:50
Show Gist options
  • Save koyta/6d045874df10ebe9088a6c0884ff1d97 to your computer and use it in GitHub Desktop.
Save koyta/6d045874df10ebe9088a6c0884ff1d97 to your computer and use it in GitHub Desktop.
Псевдо-классовое наследование

Псевдо-классовое наследование

Класс — это функция-конструктор, создающая объект по заложенному в неё шаблону и классифицирующая его собой, сохраняя в нём указатель на себя.

Прототип служит не делегатом, а прообразом нового объекта.

Наследование — создание нового класса на основе существующего.

Инкапсуляция — разграничение уровней. Базовое — отделение уровня реализации от уровня использования.

var a = {x: 1, y: 2};
var b = {x: 3, y: 4};
var c = {x: 5, y: 6};

Инкапсулируем:

function makePoint( x, y )
{
	return {
		x: x,
		y: y
	};
}
var a = makePoint( 1, 2 );
var b = makePoint( 3, 4 );
var c = makePoint( 5, 6 );

Полиморфизм — разные объекты одинаково реализуют общий интерфейс.

Констурктор всегда возвращает объект. Если функция-конструктор возвращает не объект, то объект будет создан, а возвращаемое значение проигнорированно.

Класс:

function Human( name )
{
	this.name = name || 'Some human';
}
Human.prototype['class'] = 'Mammalia';
Human.prototype.sayName = function()
{
	console.log( 'My name is ' + this.name );
};

var bob = new Human( 'Bob' );
bob.sayName(); // 'My name is Bob'

С наследованием:

function Mammalia(){}
Mammalia.prototype['class'] = 'Mammalia';
Mammalia.prototype['species'] = 'Unknown';
Mammalia.prototype.getClass = function()
{
	return this['class'];
};

function Human( name )
{
	this.name = name || 'Some human';
}
Human.prototype = new Mammalia();
Human.prototype.constructor = Human;
Human.prototype['species'] = 'Homo sapiens';
Human.prototype.sayName = function()
{
	console.log( 'My name is ' + this.name );
};

var bob = new Human( 'Bob' );
bob.sayName();
bob.species;
bob['class'];

Плохой вариант (для каждого экземпляра все методы и свойства будут создаваться заново):

function Human( name )
{
	this.name = name || 'Some human';
	this['class'] = 'Mammalia'
	
	this.sayName = function()
	{
		console.log( 'My name is ' + this.name );
	};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment