Класс — это функция-конструктор, создающая объект по заложенному в неё шаблону и классифицирующая его собой, сохраняя в нём указатель на себя.
Прототип служит не делегатом, а прообразом нового объекта.
Наследование — создание нового класса на основе существующего.
Инкапсуляция — разграничение уровней. Базовое — отделение уровня реализации от уровня использования.
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 );
};
}