2017-02-03 1 views
0

nicht erben. Ich versuche, die Mitglieder von test1 in test2 zu erben, aber es funktioniert nicht.Javascript Ich kann Mitglieder von Objekt

function inherit(a, b) 
{ 
// none of these work 
//a.prototype = b; 
//a.prototype = b(); 
//a.prototype = new b(); 
//a.prototype = Object.create(b.prototype); 
//a.prototype = Object.create(b); 
//a.prototype = b.prototype; 
} 

function test1() 
{ 
    this.val1 = 123; 
} 

function test2() 
{ 
    this.val2 = 456; 
} 


var testInstance = new test2(); 

inherit(testInstance, test1); 

console.log(testInstance.val1); 

Wie kann ich test2 erben die Mitglieder von test1?

+0

'a.prototype = Object.create (b.prototype);' hätte funktioniert, wenn Sie 'test2' anstelle von' testInstance' bestanden hätten und wenn Sie 'erben' aufgerufen hätten, bevor Sie versuchen, das Objekt mit zu instanziieren "neu". – Bergi

+0

Um instanzspezifische, konstruktorinitialisierte Eigenschaften zu "erben", ist der einzige Weg, 'test1.call (this)' innerhalb von 'test2' zu tun. – Bergi

+0

@Bergi, dieser Aufruf hat es pro Instanz funktionieren lassen, anstatt dass es alle die gleichen Mitglieder hat. Vielen Dank. – John

Antwort

-1

Zunächst einmal müssen Sie, dass berücksichtigen:

function inherit(a, b) 
{ 
// none of these work 
//a.prototype = b; 
//a.prototype = b(); 
//a.prototype = new b(); 
//a.prototype = Object.create(b.prototype); 
//a.prototype = Object.create(b); 
//a.prototype = b.prototype; 
} 

ist eine Beziehung von Klasse zu Klasse. Die Vererbung ist Klasse zu Klasse und Sie verwenden fälschlicherweise ein Objekt in diesem Bereich versucht zu sagen: „Hey Objekt versuchen, die Klasse Verhalten zu erben“ Können Sie den Fehler hier sehen?

Außerdem haben Sie erste Änderung die Beziehung zwischen diesen Klassen vor die neue object.Therefore instanziiert, sollte der Code sein:

function inherit(a, b) 
    { 


    // just this one works: 
    a.prototype = new b(); 

// none of these work 
//a.prototype = b; 
// a.prototype = b(); 
// a.prototype = Object.create(b.prototype); 
    // a.prototype = Object.create(b); 
    // a.prototype = b.prototype; 
    } 

    function test1() 
    { 
     this.val1 = 123; 
     this.print = function() { 
     console.log ("life sucks!"); 
     } 

    } 

    function test2() 
    { 
     this.val2 = 456; 
     } 
    //First you have to set the relation 
    inherit(test2, test1); 

    //After that you can create your object 
    var testInstance = new test2(); 

    console.log(testInstance.val2); 
    console.log(testInstance.val1); 
    console.log(testInstance.print); 

Schließlich sollten Sie gefragt haben! Warum kann ich in diesen Fällen die Funktion object.create nicht für die Vererbung verwenden? Das liegt daran, dass Sie den Feldern (Variablen) streng festgelegte Werte zugewiesen haben und Sie dafür das Schlüsselwort "new" verwenden müssen.

Die Konstruktorfunktionen bisher gezeigt (Object.create, b.prototype etc) Sie Eigenschaftswerte nicht angeben lassen, wenn Sie eine Instanz erstellen. Wie bei Java können Sie den Konstruktoren Argumente für Eigenschaftswerte für Instanzen initialisieren. Die folgende Abbildung zeigt eine Möglichkeit, dies zu tun.

Bitte beachten Sie diesen Artikel zu lesen: link

Ich hoffe, ich habe Ihnen geholfen. Alles Gute. Prost

+0

[Verwenden Sie nicht 'new', um Prototypobjekte zu erstellen] (http://stackoverflow.com/a/17393153/1048572?Benefits-of-using-Object.create-for-inheritance). 'Object.create' ist der richtige Weg hier. – Bergi

+0

Tatsächlich ist in * JavaScript * Vererbung * von einem Objekt zu einem anderen Objekt. Dass Beziehungen in Klassen organisiert werden können, die für die Instanziierung verwendet werden, spielt keine Rolle. – Bergi

+0

@Bergi Ich versuchte Object.create und funktioniert nicht. Warum das? – iwaduarte

Verwandte Themen