2016-08-10 5 views
1

In Douglas Crockford JavaScript verwenden: The Good Parts, erklärt er die Idee der pseudo Erbe mit diesem Stück Code, die Cat von Mammal vererben zeigt.Verwirrung darüber, wann Prototyp in Crockford Beispiel pseudo Inheritance

Dann führt er eine neue Methode namens "vererbt" ein, um den Code lesbarer zu machen.

Function.method('inherits', function (Parent) { 
    this.prototype = new Parent(); 
    return this; 
}); 

Er zeigt das Beispiel erneut mit der neuen Methode 'inherit'.

var Cat = function (name) { 
     this.name = name; 
     this.saying = 'meow'; 
    }. 
     inherits(Mammal). 
     method('purr', function (n) { 
      var i, s = ''; 
      for (i = 0; i < n; i += 1) { 
       if (s) { 
        s += '-'; 
     } 
     s += 'r'; 
    } 
    return s; 
    }). 
    method('get_name', function() { 
     return this.says() + ' ' + this.name + ' ' + this.says(); 
}); 

Es mir vor wie in diesem neuen Beispiel sieht, purr und get_name werden direkt auf das Cat Objekt definiert, während im ersten Beispiel, das sie auf Cat.prototype definiert wurden. Ist das richtig? Wenn ja, warum hat er seine neuen Methoden nicht auf definiert? Macht es einen Unterschied?

+0

Uh, bist du sicher, dass er 'Cat.prototype = new Mammal();' (ohne zu erklären, wie es falsch ist)? Ich dachte, er hätte es besser gewusst. – Bergi

+0

Im vorherigen Kapitel (Ch 4) bezeichnet er die klassisch inspirierte Syntax als "die schlechteste der beiden Welten" und sagt, dass "die Verwendung dieses Stils [das neue Schlüsselwort] der Konstruktorfunktionen nicht zu empfehlen ist. Wir werden bessere Alternativen sehen im nächsten Kapitel. " –

+0

OK, gut dann :-) – Bergi

Antwort

0

purrget_name und werden direkt auf das Cat Objekt definiert, während in dem ersten Beispiel, das sie auf Cat.prototype definiert wurden. Ist das richtig?

No. Während er die Methode auf der methodCat Funktion aufruft, hat es Methoden auf der .prototype Eigenschaft des Empfängers definieren. Vielleicht ein paar Seiten zurückdrehen und einen Blick für Function.prototype.method auf dem Code hat wieder:

Function.prototype.method = function (name, func) { 
    this.prototype[name] = func; 
    return this; 
}; 

Macht es einen Unterschied machen?

Ja, würde es.

+1

Ich habe mir die Freiheit genommen, den Code aus dem Buch für die 'method' Methode hinzuzufügen, um die Antwort selbständiger zu machen. Hoffe, das ist OK! –

+0

@MichaelGeary Sehr OK! – Bergi

Verwandte Themen