//our Abstract class var Animal=function(){ this.name="Animal"; this.fullname=this.name; //check if we have abstract paramater in prototype if (Object.getPrototypeOf(this).hasOwnProperty("abstract")){ console.log("It is abstract class. You cannot use it."); //remove all properties from object to block usage for (var m in this){ this[m]=undefined; } } }; //very important - Animal prototype has property abstract Animal.prototype.abstract=true; Animal.prototype.hello=function(){ console.log("Hello from "+this.name); }; Animal.prototype.fullHello=function(){ console.log("Hello from "+this.fullname); }; //first inheritans var Cat=function(){ Animal.call(this);//run constructor of animal this.name="Cat"; this.fullname=this.fullname+" - "+this.name; }; Cat.prototype=Object.create(Animal.prototype); //second inheritans var Tiger=function(){ Cat.call(this);//run constructor of animal this.name="Tiger"; this.fullname=this.fullname+" - "+this.name; }; Tiger.prototype=Object.create(Cat.prototype); //cat can be used var cat=new Cat(); cat.hello(); cat.fullHello(); //tiger can be used var tiger=new Tiger(); tiger.hello(); tiger.fullHello(); //animal is abstract, cannot be used - see error in console var animal=new Animal(); animal=animal.fullHello();