Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
0005316
commit ecf9f96
Showing
5 changed files
with
3,212 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,220 @@ | ||
# Mapping C++ language features to Javascript | ||
|
||
## Namespaces | ||
|
||
A namespace is represented as a static instance (global variable) | ||
containing other namespaces, global variables and functions | ||
and class templates | ||
|
||
### Example: | ||
|
||
C++: | ||
|
||
~~~~c++ | ||
namespace foo { | ||
int x; | ||
namespace bar { | ||
double y; | ||
} | ||
} | ||
~~~~ | ||
Javascript: | ||
~~~~javascript | ||
var foo = new Object(); | ||
foo.x = 0; | ||
foo.bar = new Object(); | ||
foo.bar.y = 0.0; | ||
~~~~ | ||
|
||
## Global variables and functions | ||
|
||
Global variables and functions are properties of other context objects | ||
(global or namespaces). | ||
|
||
### Example: | ||
|
||
C++: | ||
|
||
~~~~c++ | ||
int x; | ||
namespace foo { | ||
void bar(); | ||
} | ||
~~~~ | ||
Javascript: | ||
~~~~javascript | ||
var x = 0; | ||
var foo = new Object(); | ||
foo.bar = function() { | ||
return undefined; | ||
} | ||
~~~~ | ||
|
||
## Classes | ||
|
||
Classes are defined as class templates and instantiated using the `new` | ||
operator. | ||
Class members are set in the constructor function using the `this` reference. | ||
Private class members are set using the `var` keyword. | ||
|
||
### Example: | ||
|
||
C++: | ||
|
||
~~~~c++ | ||
class Foo { | ||
int bar(); | ||
|
||
private: | ||
int x; | ||
} | ||
~~~~ | ||
Javascript: | ||
~~~~javascript | ||
var Foo = function() { | ||
var x = 42; | ||
this.bar = function() { return x; }; | ||
}; | ||
var foo = new Foo(); | ||
foo.bar(); | ||
~~~~ | ||
|
||
## Static class members and functions | ||
|
||
Static variables and functions should be added to the class template object. | ||
|
||
~~~~c++ | ||
class Foo { | ||
static std::string foo(); | ||
std::string bar(); | ||
} | ||
~~~~ | ||
Javascript: | ||
~~~~javascript | ||
var Foo = function() { | ||
this.bar = function() { | ||
return "bar"; | ||
} | ||
}; | ||
Foo.foo = function() { | ||
return "foo"; | ||
}; | ||
var foo = new Foo(); | ||
foo.foo() | ||
> TypeError: Object [object Object] has no method 'foo' | ||
Foo.foo() | ||
> "foo" | ||
foo.bar(); | ||
> "bar" | ||
~~~~ | ||
|
||
## Inheritance | ||
|
||
Javascript uses a prototype based inheritance mechanism. This limits | ||
feature support to single inheritance. | ||
|
||
### Example: | ||
|
||
C++: | ||
|
||
~~~~c++ | ||
class Foo { | ||
public: | ||
int foo(); | ||
|
||
private: | ||
int x; | ||
} | ||
|
||
class Bar: public Foo { | ||
public: | ||
int bar(); | ||
} | ||
~~~~ | ||
Javascript: | ||
~~~~javascript | ||
var Foo = function() { | ||
var x = 42; | ||
this.foo = function() { return x; }; | ||
}; | ||
var Bar = function() { | ||
this.bar = function() { return 6; }; | ||
} | ||
Bar.prototype = new Foo(); | ||
Bar.prototype.constructor = Bar; | ||
var foo = new Foo(); | ||
var bar = new Bar(); | ||
foo.foo() | ||
> 42 | ||
foo.bar() | ||
> TypeError: Object [object Object] has no method 'bar' | ||
bar.foo() | ||
> 42 | ||
bar.bar() | ||
> 6 | ||
~~~~ | ||
|
||
## Virtual methods | ||
|
||
The prototype mechanism of Javascript allows method overriding which is | ||
needed to map the concept of virtual functions. | ||
|
||
### Example: | ||
|
||
C++: | ||
|
||
~~~~c++ | ||
class Foo { | ||
public: | ||
virtual int foo(); | ||
} | ||
|
||
class Bar: public Foo { | ||
public: | ||
virtual int foo(); | ||
} | ||
~~~~ | ||
Javascript: | ||
~~~~javascript | ||
var Foo = function() { | ||
this.foo = function() { return 1; }; | ||
}; | ||
var Bar = function() {} | ||
Bar.prototype = new Foo(); | ||
Bar.prototype.constructor = Bar; | ||
Bar.prototype.foo = function() { return 42; }; | ||
var foo = new Foo(); | ||
var bar = new Bar(); | ||
foo.foo() | ||
> 1 | ||
bar.foo() | ||
> 42 | ||
~~~~ | ||
|
||
## Overloading | ||
|
||
In Javascript like in other scripting languages method overloading is not | ||
available. I.e., there can only be one function for one function name. | ||
Therefore, it is necessary to implement a method dispatching mechanism | ||
for these methods. | ||
|
Oops, something went wrong.