Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

This JavaScript syntax I haven't seen till now, what does it do really?

Tags:

Today I saw a JavaScript syntax (when invoking a function) that is unfamiliar to me. It was like:

def('Person') ({   init: function(name) {this.name=name;}   ,speak: function(text) {alert(text || 'Hi, my name is ' + this.name);} }); 

, and

def('Ninja') << Person ({   kick: function() {this.speak('I kick u!');} }); 

1: What happens with the object within the parentheses in the first example? It is handled by the def function somehow, but I don't understand what is going on here (see the def function below). Where does the object go?

2: About the same thing again, but a use of the << operator that I never seen (I think!). What's that all about?

The code is from http://gist.github.com/474994, where Joe Dalton has made a small JavaScript-OO-inheritance thing (it is apparently a fork of someone else's work, but quite thoroughly rewritten, as it seems). Maybe you want to check it out there for the stuff referenced by the def function, which I give you here:

function def(klassName, context) {   context || (context = global);    // Create class on given context (defaults to global object)   var Klass =     context[klassName] = function Klass() {        // Called as a constructor       if (this != context) {          // Allow the init method to return a different class/object         return this.init && this.init.apply(this, arguments);       }        // Called as a method       // defer setup of superclass and plugins       deferred._super = Klass;       deferred._plugins = arguments[0] || { };     };    // Add static helper method   Klass.addPlugins = addPlugins;    // Called as function when not   // inheriting from a superclass   deferred = function(plugins) {     return Klass.addPlugins(plugins);   };    // valueOf is called to set up   // inheritance from a superclass   deferred.valueOf = function() {     var Superclass = deferred._super;     if (!Superclass)         return Klass;     Subclass.prototype = Superclass.prototype;     Klass.prototype = new Subclass;     Klass.superclass = Superclass;     Klass.prototype.constructor = Klass;     return Klass.addPlugins(deferred._plugins);   };   return deferred; } 
like image 899
npup Avatar asked Jul 14 '10 11:07

npup


People also ask

What is the point of this in JavaScript?

In JavaScript, the this keyword refers to an object. Which object depends on how this is being invoked (used or called). The this keyword refers to different objects depending on how it is used: In an object method, this refers to the object.

What does $() do in JavaScript?

The $() function The dollar function, $(), can be used as shorthand for the getElementById function. To refer to an element in the Document Object Model (DOM) of an HTML page, the usual function identifying an element is: document. getElementById("id_of_element").

What is the problem with JavaScript?

These days, most cross-browser JavaScript problems are seen: When poor-quality browser-sniffing code, feature-detection code, and vendor prefix usage block browsers from running code they could otherwise use just fine. When developers make use of new/nascent JavaScript features, modern Web APIs, etc.)

What is def in JS?

1: The call def('Person') returns a function, which is called with the object as parameter. It's the same principle as: function x() { return function(y) { alert(y); } } x()('Hello world! '); 2: The << operator is the left shift operator.


1 Answers

1: The call def('Person') returns a function, which is called with the object as parameter. It's the same principle as:

function x() {   return function(y) { alert(y); } }  x()('Hello world!'); 

2: The << operator is the left shift operator. It shifts an integer value a specific number of bits to the left. I haven't found any reference for any other use for it, and there is no operator overloading in Javascript, so I can't make any sense out of using it on a function. So far it looks like a typo to me.

Edit:

As Tim explained, the shift operator is just used to induce a call to the valueOf method. It works like an overload of all operators, taking over the original purpose and doing something completely different.

like image 61
Guffa Avatar answered Oct 20 '22 21:10

Guffa