Skip to content

Instantly share code, notes, and snippets.

@YozhEzhi
Last active June 20, 2018 21:19
Show Gist options
  • Select an option

  • Save YozhEzhi/6374973cedc0932d091e17f244b010e4 to your computer and use it in GitHub Desktop.

Select an option

Save YozhEzhi/6374973cedc0932d091e17f244b010e4 to your computer and use it in GitHub Desktop.
JS: OOP.

Classes in JS.

// 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment