====== Пример создания класса на JS ======
===== Чуть новее чем в class =====
Как классы на JS создаю Я. Небольшой и понятный код как легко создать класс который будет работать на всех более или менее новых браузерах.
function MyBaseClass() {
return {
'toString': function() { return "x=" + this.x + " y=" + this.y; }
};
}
function MyClass(arg_x, arg_y) {
if ( ! (this instanceof MyClass)) return new MyClass(arg_x, arg_y);
// Public scope variables
var _exports_ = new MyBaseClass();
_exports_['x'] = arg_x;
_exports_['y'] = arg_y;
// Private scope variables
var x = arg_x, y = arg_y;
_exports_['getLocalX'] = function() { return x; };
_exports_['setLocalX'] = function(value) { x = value; };
_exports_['getLocalY'] = function() { return y; };
_exports_['setLocalY'] = function(value) { y = value; };
_exports_['getPublicX'] = function() { return this.x; };
_exports_['setPublicX'] = function(value) { this.x = value; };
_exports_['getPublicY'] = function() { return this.y; };
_exports_['setPublicY'] = function(value) { this.y = value; };
return _exports_;
}
// Example of usage
var a = new MyClass(0, 0); // With new keyword
a.setLocalX(5);
a.setPublicX(10);
var b = MyClass(100, 100); // Without new keyword
b.setLocalX(105);
b.setPublicX(110);
console.log(a, ""+a, a.getLocalX());
console.log(b, ""+b, b.getLocalX());
===== Старый JS в виде prototypes работает для NodeJS версий 0.12 =====
function extend (base, constructor) {
var prototype = new Function();
prototype.prototype = base.prototype;
constructor.prototype = new prototype();
constructor.prototype.constructor = constructor;
}
// Base class
function App(name, surname) {
if (!(this instanceof App)) throw new Error("not constructed");
this._name = name;
this._surname = surname;
}
App.prototype.getName = function() {
return this._name;
}
App.prototype.toString = function() {
const about = {};
about[this.__proto__.constructor.name] = {
"name": this._name,
"surname": this._surname
}
return JSON.stringify(about);
}
// Extended Class
function Zeffa(name, surname, age) {
App.call(this, name, surname);
this._age = age;
}
// important that this happens before you override methods on parent class
extend(App, Zeffa);
Zeffa.prototype.getAge = function() {
return this._age;
}
// Test
const a = new Zeffa("Василий", "Пупкин", 18);
console.log("" + a);
console.log(a.getAge());