Skip to content

Commit 22d0e4d

Browse files
committed
add the new code piece, which is John's simple inheritance
1 parent ed019d6 commit 22d0e4d

File tree

1 file changed

+99
-0
lines changed

1 file changed

+99
-0
lines changed

john_simple_inheritance.js

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
/* Simple JavaScript Inheritance
2+
* By John Resig http://ejohn.org/
3+
* MIT Licensed.
4+
*/
5+
// Inspired by base2 and Prototype
6+
(function(){
7+
var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
8+
9+
// The base Class implementation (does nothing)
10+
this.Class = function(){};
11+
12+
// Create a new Class that inherits from this class
13+
Class.extend = function(prop) {
14+
var _super = this.prototype;
15+
16+
// Instantiate a base class (but only create the instance,
17+
// don't run the init constructor)
18+
initializing = true;
19+
var prototype = new this();
20+
initializing = false;
21+
22+
// Copy the properties over onto the new prototype
23+
for (var name in prop) {
24+
// Check if we're overwriting an existing function
25+
prototype[name] = typeof prop[name] == "function" &&
26+
typeof _super[name] == "function" && fnTest.test(prop[name]) ?
27+
(function(name, fn){
28+
return function() {
29+
var tmp = this._super;
30+
31+
// Add a new ._super() method that is the same method
32+
// but on the super-class
33+
this._super = _super[name];
34+
35+
// The method only need to be bound temporarily, so we
36+
// remove it when we're done executing
37+
var ret = fn.apply(this, arguments);
38+
this._super = tmp;
39+
40+
return ret;
41+
};
42+
})(name, prop[name]) :
43+
prop[name];
44+
}
45+
46+
// The dummy class constructor
47+
function Class() {
48+
// All construction is actually done in the init method
49+
if ( !initializing && this.init )
50+
this.init.apply(this, arguments);
51+
}
52+
53+
// Populate our constructed prototype object
54+
Class.prototype = prototype;
55+
56+
// Enforce the constructor to be what we expect
57+
Class.prototype.constructor = Class;
58+
59+
// And make this class extendable
60+
Class.extend = arguments.callee;
61+
62+
return Class;
63+
};
64+
})();
65+
66+
/* test case */
67+
var Person = Class.extend({
68+
init: function(isDancing){
69+
this.dancing = isDancing;
70+
},
71+
dance: function(){
72+
return this.dancing;
73+
}
74+
});
75+
76+
var Ninja = Person.extend({
77+
init: function(){
78+
this._super( false );
79+
},
80+
dance: function(){
81+
// Call the inherited version of dance()
82+
return this._super();
83+
},
84+
swingSword: function(){
85+
return true;
86+
}
87+
});
88+
89+
var p = new Person(true);
90+
p.dance(); // => true
91+
92+
var n = new Ninja();
93+
n.dance(); // => false
94+
n.swingSword(); // => true
95+
96+
// Should all be true
97+
p instanceof Person && p instanceof Class &&
98+
n instanceof Ninja && n instanceof Person && n instanceof Class
99+

0 commit comments

Comments
 (0)