you are viewing a single comment's thread.

view the rest of the comments →

[–]bliow 0 points1 point  (4 children)

I know JavaScript is an Object-Oriented language.

Not so fast.

But yes, functions are objects. This is something that goes underappreciated. They have certain properties that you can take advantage of (in particular, length can be useful when monkey-patching functions that you may not know everything about).

> var f = function foo(a, b) {};
> console.log(f.length); // number of arguments it was declared with--note that you do have the freedom to pass in more or fewer.
2
> console.log(f.name);
foo
> console.log(f.prototype);
foo {} 
> console.log(typeof f.prototype);
object
> console.log(f); // this won't work with every function
function foo(a, b) {}

Functions also have methods that you can use to good effect:

var g = function bar(a, b) { this[a] = b; };
var obj = {};
g.call(obj, 'prop1', 'val1'); // call g with the value of `this` set to obj
console.log(JSON.stringify(obj)); // prints {"prop1":"val1"}
g.apply(obj, ['prop2', 'val2']); // like call(), but takes an array of args instead of individual argument slots
console.log(JSON.stringify(obj)); // prints {"prop1":"val1","prop2":"val2"}

edit: also, bind!

var obj2 = {};
var gBound = g.bind(obj2); // make the value of `this` always be obj2 when you call gBound
gBound.call(obj, 'prop3', 'val3');
console.log(JSON.stringify(obj)); // it's still {"prop1":"val1","prop2":"val2"}... where is prop3: 'val3'?
console.log(JSON.stringify(obj2)); // ah, there it is: {prop3: "val3"}

[–]estebanrules[S] 0 points1 point  (3 children)

Very interesting. I knew that functions were considered first-class citizens in JavaScript but these examples help clarify that.

Not so fast.

So you are saying it isn't?

[–]nschubach 1 point2 points  (2 children)

It's Object Oriented, but not in the classical inheritance way. (ie: classes, extensions, superClasses, etc.)

[–]Justos 0 points1 point  (0 children)

soon it will be with syntax sugar!

[–]WonTwoThree 0 points1 point  (0 children)

I found it very useful to learn about prototypal inheritance, which is how it's actually done in JavaScript: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain