ZAKAS OOP CHAPTER TWO : Functions (are objects!)

Notes and demo from Zakas Book

by nickadeemus2002

HTML

<script src="https://getfirebug.com/firebug-lite-debug.js"></script>

JavaScript

/*
**********************************************
ZAKAS OOP CHAPTER TWO : Functions (are objects!)
**********************************************
*/
//The defining characteristic
//of a function - what distinguishes 
//it from any other object - is 
//the presence of an internal property
//named [[Call]].

//The [[Call]] property is unique 
//to functions and indicates that 
//the object can be executed.

//First Class Citizens (objects):  assign 
//them to variables, add them to objects, 
//pass them to other functions as
//arguments, and return them from 
//functions.

/*
 **************************************
 * this Object
 **************************************
 */
/*
// manipulate this using BIND , JS5 only
function sayNameForAll(label) {
    //this: determined by context 
    //where invoked
    console.log(label + ":" + this.name);
}
var person1 = {
    name: "Makyla"
};
var person2 = {
    name: "Kathryn"
};
//sayNameForAll accessed as object
var sayNameForPerson1=sayNameForAll.bind(person1);
sayNameForPerson1("person1");
var sayNameForPerson2=sayNameForAll.bind(person2, 'person2');
sayNameForPerson2();
*/

/*
// manipulate this using APPLY
function sayNameForAll(label) {
    //this: determined by context 
    //where invoked
    console.log(label + ":" + this.name);
}
var person1 = {
    name: "Makyla"
};
var person2 = {
    name: "Kathryn"
};
name = "Chris";
//sayNameForAll accessed as object
sayNameForAll.apply(this, ["global"] );
sayNameForAll.apply(person1, ["person1"] );
sayNameForAll.apply(person2, ["person2"] );
*/

/*
// manipulate this using CALL
function sayNameForAll(label) {
    //this: determined by context 
    //where invoked
    console.log(label + ":" + this.name);
}
var person1 = {
    name: "Makyla"
};
var person2 = {
    name: "Kathryn"
};
name = "Chris";
//sayNameForAll accessed as object
sayNameForAll.call(this, "global");
sayNameForAll.call(person1, "person1");
sayNameForAll.call(person2, "person2");
*/


/*
//generic global...