// ES5 way
var Point = function(xPos, yPos) {
this.xPos = xPos;
this.yPos = yPos;
};
Point.prototype.getPos = function() {
return 'X: ' + this.xPos + ' Y: ' + this.yPos;
};
var point = new Point(100, 200);
// ES6 way
class Point {
constructor(xPos, yPos) {
this.xPos = xPos;
this.yPos = yPos;
}
getPos(){
return 'X: ' + this.xPos + ' Y: ' + this.yPos;
}
}
const point = new Point(100, 200);В большинстве языков каждый объект является экземпляром связанного с ним класса, который предоставляет код, совместно используемый всеми его экземплярами.
В отличие от этого в JS нет понятия классов. Вместо этого объекты наследуются из других объектов. Каждый объект ассоциируется с каким-нибудь другим объектом, известным в качестве его прототипа.
Классы в JS, по сути, представляют собой сочетание функции-конструктора (Point) и объекта-прототипа, используемого для совместного применения методов экземплярами класса (Point.prototype).
Прототипы задействуют три разных, но в то же время связанных друг с другом механизма доступа, и названия всех трех являются вариациями слова «prototype».
- Выражение
C.prototypeслужит для создания прототипа объектов, созданных с помощью оператораnew C(); - Выражение
Object.getPrototypeOf(obj)является стандартным (согласно ES5) механизмом получения прототипа объектаobj; - Выражение
obj.__proto__является механизмом получения прототипа объектаobj;
При создании экземпляра от функции-класса (конструктора), если не использовать оператор new, то параметры из this
будут ссылаться на глобальный объект.
Избежать этого можно проверкой:
function User(name, passwordHash) {
var self = this instanceof User ?
this :
Object.create(User.prototype);
self.name = name;
self.passwordHash = passwordHash;
return self;
}
var x = User('baravelli', 'd8b74df393528d51cd19980ae0aa028e');
var y = new User('baravelli', 'd8b74df393528d51cd19980ae0aa028e');
x instanceof User; // true
y instanceof User; // true