2017-02-17 5 views
1

Ich bin neu in JS und habe folgendes Problem:Aufruf einer Methode des Prototyps eines Objekts

Warum funktioniert das nicht/was macht dieser Code?

var Test = {}; 
Test.prop = "test property"; 

Test.Class1 = function() { 
} 

Test.Class1.prototype = { 
    m1: function() { 
     console.log(this.prop); 
    } 
} 

Test.Class1.m1(); 

Mein Verständnis dieser Code wäre:

  1. die Schaffung eines neuen Objekts -Test
  2. Hinzufügen der Eigenschaft namens prop zu -Test
  3. Erstellen eines neuen Objekts genannt Class1 in Test
  4. Hinzufügen einer Methode m1 zu Class1
  5. das Werk Verkettungs m1 Methode der Class1 in -Test

Antwort

1

In JavaScript, auch die prototy m1

bearbeiten zugänglich sein Die Eigenschaft einer Funktion ist ein Objekt. Bevor Sie ein Objekt erstellen, dessen Prototyp das von Ihnen definierte ist, ist Test1.Class1.prototype nur ein normales Objekt. Im Grunde funktioniert es die gleiche Art und Weise wie der folgende Code-Schnipsel:

var Test1 = { prototype { m1: function() {} } }; 
// You're trying to call an undefined function! 
Test.m1(); 

// This is fine 
Test1.prototype.m1(); 

In der anderen Hand, wenn Sie die new Operator verwenden, sind Sie ein neues Objekt, dessen Prototyp zu schaffen ist der eine Satz an den Konstruktor-Funktion.Und hier beginnt die Magie:

var Test1 = function() {}; 
Test1.prototype = { 
    doStuff: function() {} 
}; 

var object1 = new Test1(); 
// This works! 
object1.doStuff(); 

Wenn Sie eine Eigenschaft zuzugreifen, JavaScripts Runtimes inspizieren das Objekt, um herauszufinden, ob es eine Funktion ist doStuff genannt, sonst sieht es für sie auf den Prototyp des Objekts, sonst sieht es auf der Prototyp des Prototyps und so weiter ...

Eigentlich new Operator ist ein syntactic sugar. ECMA-Script 5 Object.create eingeführt, die alles klar mehr macht:

var Test1 = { 
    doStuff: function() { 
    } 
}; 

// The first parameter of Object.create is 
// the object that's going to be the prototype of 
// Test1 object! 
var object1 = Object.create(Test1); 
// This works too! 
object1.doStuff(); 

Wahrscheinlich sollten Sie diese anderen Q & A überprüfen: How does JavaScript .prototype work?

0

prototype Aufruf nur für Fälle mit dem neuen Betreiber erstellt wurden.

Andernfalls müssen Sie den Prototyp explizit aufrufen, um auf die Methode zugreifen zu können.

let testClass = new Test.Class1(); 

testClass.m1(); 

Auch, weil Sie versuchen, auf die prop Eigenschaft zuzugreifen.

Test.Class1.prototype = { 
    m1: function() { 
     console.log(this.prop); 
    } 
} 

Der Aufrufort ist Test.Class1, die prop sollte funktionieren Teil Test.Class1 und nicht auf Test

+0

Nicht nur. Was ist mit 'Object.create': D –

0

ich geändert bis die Namen der Dinge, aber dies sollte sein.

var Person = function(){ 
    this.message = "Hello, world!"; 
}; 

Person.prototype = Object.create(Object.prototype); 
Person.prototype.constructor = Person; 

Person.prototype.greet = function(){ 
    console.log(this.message); 
    alert(this.message); 
}; 

var tom = new Person(); 
tom.greet(); 
0

Sie müssen eine Instanz der Prototypen erstellen, bevor Sie in der Lage sind, ihre Methoden zu verwenden:

var instance = new Test.Class1(); 
console.log(instance.m1()); 

Auch als solche Test.prop nicht Teil der Instanz ist, und werden nicht Hier ist ein funktionierendes Beispiel:

var test = function() { 
    this.prop = "A property"; 
} 

test.prototype.m1 = function() { 
    console.log(this.prop); 
} 

var instance = new test(); 
console.log(instance.m1()); 
Verwandte Themen