// -------------------------------------

// Basic object
var Base = {
	
	// Public properties and methods
	dayName : "Tuesday",
	
	day : this.dayName,
	
	getDay : function () {
		return this.dayName;
	},
	
	setDay : function (newDayName) {
		this.dayName = newDayName;
	}
};

// Using new Base() is not an option, since it isn't a constructor
Sub.prototype = Base;
function Sub () {
	// Constructor
};

var a = new Sub();
// Returns "Tuesday"
alert(a.getDay());

var b = new Sub();
// Returns "Tuesday"
alert(b.getDay());

// Sets dayName to "Wednesday"
a.setDay("Wednesday");

// Returns "Wednesday"
alert(a.getDay());

// Returns "Tuesday"
alert(b.getDay());

// Returns undefined
alert(b.day);





// -------------------------------------
// Basic Prototype inheritance
function Base () {

	// Private variable
	var dayName = "Tuesday";
	
	// Private method
	function getPrivateDayName () {
		return dayName;
	}

	// Public properties and methods
	this.day = dayName;

	this.getDay = function () {
		return getPrivateDayName();
	};

	this.setDay = function (newDayName) {
		dayName = newDayName;
	};
};


Sub.prototype = new Base;
function Sub () {
	// Constructor
};

var a = new Sub();
// Returns "Tuesday"
alert(a.getDay());

var b = new Sub();
// Returns "Tuesday"
alert(b.getDay());

// Sets dayName to "Wednesday"
a.setDay("Wednesday");

// Returns "Wednesday"
alert(a.getDay());

// Returns "Wednesday"
alert(b.getDay());

// Returns "Tuesday"
alert(b.day);


// -------------------------------------
// Yahoo JavaScript Module Pattern
var Base = function () {
	
	// Private variable
	var dayName = "Tuesday";
	
	// Private method
	var getPrivateDayName = function () {
		return dayName;
	}
	
	// Public properties and methods
	return {
		
		day : dayName,
		
		getDay : function () {
			return getPrivateDayName.call(this);
		},
		
		setDay : function (newDayName) {
			dayName = newDayName;
		}
	};
}();


// Using new Base() is not an option, since it isn't a constructor
Sub.prototype = Base;
function Sub () {
	// Constructor
};

var a = new Sub();
// Returns "Tuesday"
alert(a.getDay());

var b = new Sub();
// Returns "Tuesday"
alert(b.getDay());

// Sets dayName to "Wednesday"
a.setDay("Wednesday");

// Returns "Wednesday"
alert(a.getDay());

// Returns "Wednesday"
alert(b.getDay());

// Returns "Tuesday"
alert(b.day);


// -------------------------------------
// Closure-created constructor
var Base = (function () {
	
	// Constructor
	function Base () {
		
	}
	
	// Private variable
	var dayName = "Tuesday";
	
	// Private method
	function getPrivateDayName () {
		return dayName;
	}
	
	// Public properties and methods
	Base.prototype.day = dayName;
	Base.prototype.getDay = function () {
		return getPrivateDayName.call(this);
	};
	
	Base.prototype.setDay = function (newDayName) {
		dayName = newDayName;
	};
	
	return Base;
})();


Sub.prototype = new Base;
function Sub () {
	// Constructor
};

var a = new Sub();
// Returns "Tuesday"
alert(a.getDay());

var b = new Sub();
// Returns "Tuesday"
alert(b.getDay());

// Sets dayName to "Wednesday"
a.setDay("Wednesday");

// Returns "Wednesday"
alert(a.getDay());

// Returns "Wednesday"
alert(b.getDay());

// Returns "Tuesday"
alert(b.day);