,

The Decorator Pattern

//The class we're going to decorate
function Macbook(){
      this.cost = function(){
      return 1000;
     };
}

function Memory(macbook){
    this.cost = function(){
     return macbook.cost() + 75;
  };
}

function BlurayDrive(macbook){
   this.cost = function(){
     return macbook.cost() + 300;
  };
}


function Insurance(macbook){
   this.cost = function(){
     return macbook.cost() + 250;
  };
}

 
// Sample usage
var myMacbook = new Insurance(new BlurayDrive(new Memory(new Macbook())));
console.log( myMacbook.cost() );

function ConcreteClass(){
	this.performTask = function()
	{
		this.preTask();
		console.log('doing something');
		this.postTask();
	};
}

function AbstractDecorator(decorated){
	this.performTask = function()
	{
		decorated.performTask();
	};
}

function ConcreteDecoratorClass(decorated){
	this.base = AbstractDecorator;
	this.base(decorated);
	
	this.preTask = function()
	{
		console.log('pre-calling..');
	};
	
	this.postTask = function()
	{
		console.log('post-calling..');
	};
	
}

var concrete = new ConcreteClass();
var decorator1 = new ConcreteDecoratorClass(concrete);
var decorator2 = new ConcreteDecoratorClass(decorator1);
decorator2.performTask();