Die Vererbung von Javascript scheint überall wie eine offene Debatte zu sein. Es kann "Der merkwürdige Fall der Javascript-Sprache" genannt werden.
Die Idee ist, dass es eine Basisklasse gibt und Sie dann die Basisklasse erweitern, um eine vererbungsähnliche Funktion zu erhalten (nicht vollständig, aber immer noch).
Die ganze Idee ist zu verstehen, was Prototyp wirklich bedeutet. Ich habe es nicht bekommen, bis ich gesehen habe, dass John Resigs Code (in der Nähe dessen, was er jQuery.extend
tut) einen Codeblock geschrieben hat, der dies tut, und er behauptet, dass Base2- und Prototyp-Bibliotheken die Quelle der Inspiration waren.
Hier ist der Code.
/* Simple JavaScript Inheritance
* By John Resig http://ejohn.org/
* MIT Licensed.
*/
// Inspired by base2 and Prototype
(function(){
var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
// The base Class implementation (does nothing)
this.Class = function(){};
// Create a new Class that inherits from this class
Class.extend = function(prop) {
var _super = this.prototype;
// Instantiate a base class (but only create the instance,
// don't run the init constructor)
initializing = true;
var prototype = new this();
initializing = false;
// Copy the properties over onto the new prototype
for (var name in prop) {
// Check if we're overwriting an existing function
prototype[name] = typeof prop[name] == "function" &&
typeof _super[name] == "function" && fnTest.test(prop[name]) ?
(function(name, fn){
return function() {
var tmp = this._super;
// Add a new ._super() method that is the same method
// but on the super-class
this._super = _super[name];
// The method only need to be bound temporarily, so we
// remove it when we're done executing
var ret = fn.apply(this, arguments);
this._super = tmp;
return ret;
};
})(name, prop[name]) :
prop[name];
}
// The dummy class constructor
function Class() {
// All construction is actually done in the init method
if ( !initializing && this.init )
this.init.apply(this, arguments);
}
// Populate our constructed prototype object
Class.prototype = prototype;
// Enforce the constructor to be what we expect
Class.prototype.constructor = Class;
// And make this class extendable
Class.extend = arguments.callee;
return Class;
};
})();
Es gibt drei Teile, die den Job machen. Zunächst durchlaufen Sie die Eigenschaften und fügen sie der Instanz hinzu. Danach erstellen Sie einen Konstruktor, der später zum Objekt hinzugefügt werden soll. Jetzt lauten die wichtigsten Zeilen:
// Populate our constructed prototype object
Class.prototype = prototype;
// Enforce the constructor to be what we expect
Class.prototype.constructor = Class;
Sie zeigen zuerst Class.prototype
auf den gewünschten Prototyp. Jetzt hat sich das gesamte Objekt geändert, sodass Sie das Layout auf das eigene zurücksetzen müssen.
Und das Anwendungsbeispiel:
var Car = Class.Extend({
setColor: function(clr){
color = clr;
}
});
var volvo = Car.Extend({
getColor: function () {
return color;
}
});
Lesen Sie mehr darüber hier bei Javascript Inheritance von John Resigs Beitrag.
.extend
ist nicht integriert, wird jedoch häufig von einer Bibliothek wie jQuery oder Prototype bereitgestellt.