Ich würde gerne wissen, wie man child dazu bringt, die Prototypmethoden sowohl von sich selbst als auch von base abzurufen.

Auch gibt es keine Möglichkeit zu tun

child.prototype = Object.create(base.prototype);
child.prototype.constructor = child;

Innerhalb des child IIFE und nicht außerhalb.

var base = (function(){

    var cls = function(){

    };

    cls.prototype = {
        doStuff: function(){
            console.log('dostuff');
        }
    };

    return cls;

})();

var child = (function(){

    var cls = function(){
        base.call(this);    
    };

    cls.prototype = {
        doOtherStuff: function(){
            console.log('doOtherStuff');
        }
    };

    return cls;

})();

child.prototype = Object.create(base.prototype);
child.prototype.constructor = child;

var b = new child();
b.doStuff();
b.doOtherStuff();

http://jsfiddle.net/9uGsA/

1
Johan 5 Dez. 2013 im 18:45

3 Antworten

Beste Antwort

Ich würde gerne wissen, wie man ein Kind dazu bringt, die Prototypmethoden sowohl von sich selbst als auch von der Basis zu erhalten.

  1. Führen Sie child.prototype = Object.create(base.prototype); aus, bevor Sie einen untergeordneten Prototyp einrichten.
  2. Anstatt cls.prototype = ... auszuführen, fügen Sie cls.prototype nacheinander Eigenschaften hinzu.

Es gibt auch eine Möglichkeit, [Vererbung] innerhalb des child IIFE und nicht außerhalb des IIFE durchzuführen.

Verwenden Sie natürlich einfach cls anstelle von child.

http://jsfiddle.net/7uCwz/

Bonus-Geige: http://jsfiddle.net/7uCwz/1/

1
Dagg Nabbit 5 Dez. 2013 im 15:11

Definieren Sie eine Funktion http://jsfiddle.net/9uGsA/1/

function inherit(base, child, proto) {
    child.prototype = Object.create(base.prototype);
    child.prototype.constructor = child;

    proto&&Object.keys(proto).forEach(function(key){
        child.prototype[key] = proto[key];    
    })

}

Und benutze es so

var child = (function(){

    var cls = function(){
        base.call(this);    
    };

    inherit(base, cls, {doOtherStuff: function(){
            console.log('doOtherStuff');
    }});


    return cls;

})();
1
Yury Tarabanko 5 Dez. 2013 im 14:53

Neue einfachere Antwort:

//test inheritance
//parent class
var mom = function(name){
    this.momsname = name;
}
mom.prototype.getMomsName = function(){ return this.momsname; }

//child class
var kid = function(mother,name){
    this.sonsname = name;
    //call the parent
    mom.call(this,mother);
}
//add the parent's methods
kid.prototype = new mom();
//point the constructor to the child
kid.prototype.constructor = kid;
kid.prototype.getKidsName = function() { return this.sonsname }
//instatiate the child
var son = new kid("Mary","Tom");
//use only the child's methods
var temp2 = "Son's name: " + son.getKidsName() + ". Mother's Name: " + son.getMomsName() + ".";
//temp now holds "Son's name: Tom. Mother's Name: Mary." 
0
Jon Crawford 26 Nov. 2016 im 20:17