JS OOP:
class Car { constructor(make) { this.make = make; this.isOn = false; } start() { this.isOn = true; console.log(`${this.make} started.`); } stop() { this.isOn = false; console.log(`${this.make} stopped.`); } isRunning() { return this.isOn; } } class ElectricCar extends Car { constructor(make, batteryCapacity) { super(make); this.batteryCapacity = batteryCapacity; } charge() { console.log(`${this.make} is charging.`); } } let myElCar = new ElectricCar('EV', '100 kWh'); myElCar.start(); // EV started. console.log(myElCar.isRunning()); // true myElCar.stop(); // EV stopped. console.log(myElCar.isRunning()); // false myElCar.charge(); // EV is charging.
JS OOP via prototype:
var Circle = { // Class area: function() { return this.radius * this.radius * Math.PI; } } var instance = { radius:5 }; instance.__proto__ = Circle; // inheritance via prototype, does not work in IE console.log( instance.area() ); // prints '78.5398'
js:
function Circle(radius) { // Class this.radius = radius; } Circle.prototype.area = function() { return this.radius * this.radius * Math.PI; } var instance = new Circle(5); console.log( instance.area() ); // prints '78.5398'
Data and access properties
var createPerson = function(firstName, lastName) { var person = {}; Object.defineProperties(person, { firstName : { value : firstName, writable : true }, lastName : { value : lastName, writable : false }, fullName : { get : function() { return this.firstName + ' ' + this.lastName; }, set : function(value) { this.firstName = value + ' set '; this.lastName = value + ' set '; } } }); /* Object.defineProperty(person, "firstName", { value : firstName, writable : true }); Object.defineProperty(person, "lastName", { value : lastName, writable : false }); */ return person; }; var person = createPerson("John", "Doe"); //person.firstName = 'Jane'; // sets firstName to 'Jane' //person.lastName = 'New'; // cannot set lastName //person.fullName = 'New'