Conventions

First of all, Foo class is defined in a Foo.js file:

every class has a file

Here it is classic Point2d class example.


function Point2d (x, y) {
  Object.defineProperty(this, 'x', {value: x})
  Object.defineProperty(this, 'y', {value: y})
}

module.exports = Point2d

Note that constructor should contain at least once a this keyword.

The file ends with the node convention for exporting data from one file to another.

Attributes

When I discovered Object.defineProperty() I was really galvanized, cause it is an excelent way to do OOP in JavaScript IMHO.

See Object.defineProperty on MDN for a reference.

Static attribute

In Point3d.js add a dimension attribute to Point3d constructor.


function Point3d () {
 ...
 
}
 
Point3d.dimension = 3

Inheritance

Let’s create a Point3d class that inherits from Point2d. You can use Node’s util.inherits, but I recommend inherits.


var Point2d  = require('./Point2d.js')
  , inherits = require('inherits')

function Point3d (x, y, z) {
  Point2d.apply(this, arguments)

  Object.defineProperty(this, 'z', {value: z})
}

inherits(Point3d, Point2d)

module.exports = Point3d

Methods

A method can be implemented easily adding a function to prototype. In Poin2D.js after constructor definition


function length () {
  var x = this.x
    , y = this.y
    
  return Math.sqrt(x * x + y * y)
}

Point2d.prototype.length = length

Abstract method

Something like


Point2d.prototype.anAbstractMethod = function () {
  throw new Error('unimplemented abstract method')
}

Overridden method

In Point3d.js add a length method to prototype.


inherits(Point3d, Point2d)

...

function length () {
  var x = this.x
    , y = this.y
    , z = this.z
    
  return Math.sqrt(x * x + y * y + z * z)
}

Point3d.prototype.length = length

Note that it must be exported after inherits call.

Static method

In Point3d.js add a length method to Point3d constructor.


function Point3d () {
 ...
 
}

function length (x, y, z) {
  return Math.sqrt(x * x, y * y, z * z)
}

Point3d.length = length