2015-12-29 7 views
6

So war ich mit ES6 Klassen rumgespielt, wenn ich etwas sah überraschend:Zugriff ES6 Super Eigenschaften

class Animal { 
    constructor(name) { 
     this.name = name; 
    } 
    speak(sound) { 
     console.log(sound); 
    } 
} 

class Dog extends Animal { 
    constructor(name, age) { 
     super(name); 
     this.age = age; 
    } 
    speak() { 
     super.speak("Woof! I'm " + super.name + " and am " + this.age); 
    } 
} 

Dann, habe ich meinen Hund:

var mydog = new Dog("mydog",3); 
mydog.speak(); 

Nun ist diese druckt

Woof! I'm undefined and am 3 

Also meine Frage ist, warum ist super.name undefined? Ich erwarte in diesem Fall mydog.

+3

umschreiben, die nur verwendet werden kann, um auf Eigenschaften auf dem Prototyp zuzugreifen. Mit 'this.name' werden Sie der * Instanz * zugewiesen und müssen immer mit' this' darauf zugreifen. – CodingIntrigue

Antwort

9

this in dem übergeordneten Konstruktor bezieht sich immer noch an den Hund, so this.name = name, setzt die Eigenschaft name direkt auf das Dog Objekt und nicht auf seinem übergeordneten. Mit this.name funktioniert:

super.speak("Woof! I'm " + this.name + " and am " + this.age); 
+0

Hmm, ich möchte keine Eigenschaften duplizieren, ich muss 3 Minuten warten, bevor ich diese Antwort akzeptiere obwohl – Downgoat

+1

Es wird nicht wirklich dupliziert werden, es wird nur auf dem Hund selbst erstellt werden. Wenn Sie sich die Prototypkette Ihres Hundes anschauen, sehen Sie: 'Hund {Name: 'Mydog', Alter: 3} <- Hund {} <- Tier {} <- {}' – Paulpro

0

ein Verfahren für eine Objektinstanz Aufschalten der Prototyp-Methode mit dem gleichen Namen zu nennen, würden wir so etwas wie

let person = { 
    getGreeting() { 
     return "Hello"; 
    } 
}; 

let dog = { 
    getGreeting() { 
     return "Woof"; 
    } 
}; 


let friend = { 
    getGreeting() { 
     return Object.getPrototypeOf(this).getGreeting.call(this) + ", hi!"; 
    } 
}; 

// set prototype to person 
Object.setPrototypeOf(friend, person); 
console.log(friend.getGreeting());      // "Hello, hi!" 
console.log(Object.getPrototypeOf(friend) === person); // true 

// set prototype to dog 
Object.setPrototypeOf(friend, dog); 
console.log(friend.getGreeting());      // "Woof, hi!" 
console.log(Object.getPrototypeOf(friend) === dog);  // true 

Mit Object.getPrototypeOf() und .call tun (Dies) eine Methode auf den Prototyp zu nennen ist ein wenig lang, gut ECMAScript 6 zur Rettung und es eingeführt super. super ist ein Zeiger auf den Prototyp des aktuellen Objekts, genau wie der Wert Object.getPrototypeOf (this). Wenn wir dies im Hinterkopf behalten, können wir die getGreeting() Methode als

let friend = { 
    getGreeting() { 
     // in the previous example, this is the same as: 
     // Object.getPrototypeOf(this).getGreeting.call(this) 
     return super.getGreeting() + ", hi!"; 
    } 
}; 
Verwandte Themen